Skip to main content
可见性Volatile

可见性

public class VolatileTest {
    private static boolean running = true;

    public static void main(String[] args) throws InterruptedException {
        new Thread(() -> {
            System.out.println("Thread start, time: " + LocalDateTime.now());
            while (running) {
            }
            System.out.println("Thread end, time: " + LocalDateTime.now());
        }).start();

        TimeUnit.SECONDS.sleep(3);

        running = false;
    }
}

huhxAbout 2 minjavaThreadConcurrency
线程安全的单例模式

单例模式是设计模式中使用最为普遍的模式之一。它是一种对象创建模式,用于产生一个对象的具体实例,它可以确保系统中一个类只产生一个实例。单例与多线程没啥直接关系,但是保证多线程下单例模式的安全性,是件有趣且好玩的事情。今天我们就来聊聊这单例。

单例模式

饿汉模式

public class Singleton {
    private final static Singleton INSTANCE = new Singleton();

    private Singleton() {}
    
    public static Singleton getInstance() {
        return INSTANCE;
    }
}

huhxAbout 3 minjavaThreadConcurrency
线程安全Synchronized

简单使用

https://www.baeldung.com/java-synchronized

可重入性

可重入锁是同一个线程重复请求由自己持有的锁对象时,可以请求成功而不会发生死锁。与多线程并发执行的线程安全不同,可重入强调对单个线程执行时重新进入同一个子程序仍然是安全的。

public class SynchronizedTest {
    static synchronized void parentMethod() {
        childMethod();
        System.out.println("parent");
    }

    static synchronized void childMethod() {
        System.out.println("child method");
    }

    public static void main(String[] args) {
        new Thread(SynchronizedTest::parentMethod).start();
    }
}

huhxAbout 2 minjavaThreadConcurrency
线程数据ThreadLocal

如果想在线程中保存些数据,

ThreadLocal的使用

public class ThreadLocalTest {

    public static void main(String[] args) throws InterruptedException {
        var threadLocal = new ThreadLocal<>() {
            @Override
            protected String initialValue() {
                return "huhx";
            }
        };

        System.out.println(Thread.currentThread().getName() + ": " + threadLocal.get());

        new Thread(() -> {
            System.out.println(Thread.currentThread().getName() + ": " + threadLocal.get());

            threadLocal.set("linux");

            System.out.println(Thread.currentThread().getName() + ": " + threadLocal.get());
        }).start();

        TimeUnit.SECONDS.sleep(1);

        System.out.println(Thread.currentThread().getName() + ": " + threadLocal.get());
    }
}

huhxAbout 2 minjavaThreadConcurrency
线程的使用

在上一篇博客我们讲到什么是线程,这里我们来简单的介绍下线程的使用。

线程的创建

线程的创建有两种方式,一种是继承Thread类,另一种是实现Runnable接口。比较推荐的是实现Runnable接口的这种方式。

Thread本身是实现了Runnable接口的,调用start()方法会新建一个线程(这个逻辑存在于native方法start0中)并让此线程调用run()方法。


huhxOriginalAbout 12 minjavaThreadConcurrency
什么是线程

在java中稍微高级一点儿的话题,一定会涉及到多线程。那么线程到底是个什么东西,为什么让人如此的着迷和津津乐道?今天我们就展开对Thread的学习。

什么是线程

跟线程相关的概念

说服务端编程还是大量需要并行计算的,而Java也主要占领着服务端市场,那么对Java的并行计算的研究也就显得非常的必要。但首先,我想在这里先介绍几个重要的相关概念。

同步(Synchronous)和异步(Asynchronous)

同步和异步通常用来形容一次方法调用。同步方法调用一旦开始,调用者必须等到方法调用返回后,才能继续后续的行为。异步方法调用更像一个消息传递,一旦开始方法调用就会立即返回,调用者就可以继续后续的操作。而异步方法通常会在另外一个线程中真实地执行。整个过程不会阻碍调用者的工作。


huhxOriginalAbout 6 minjavaThreadConcurrency