JMM可见性及示例分析

JMM中保证了程序的可见性,即一个线程对共享变量的修改对其他线程是可见的。以下是一个示例说明JMM的可见性:

假设有两个线程t1和t2,它们同时访问一个变量x,线程t1将变量x的值设为1,然后线程t2输出变量x的值。代码如下:

public class Main {
    public static int x = 0;
    public static void main(String[] args) throws InterruptedException {
        Thread t1 = new Thread(() -> {
            x = 1;
        });
        Thread t2 = new Thread(() -> {
            while (x == 0) {
                // busy waiting
            }
            System.out.println("x = " + x);
        });
        t1.start();
        t2.start();
        t1.join();
        t2.join();
    }
}

在这个示例中,线程t1将变量x的值设为1,然后线程t2输出变量x的值。由于没有使用同步机制,如果JMM不能保证程序的可见性,那么在线程t2执行时,有可能变量x的值还是0,因为线程t2可能看不到线程t1对变量x的修改。这就是典型的“可见性”(Visibility)问题。

然而,由于JMM保证了程序的可见性,即一个线程对共享变量的修改对其他线程是可见的,线程t1将变量x的值设为1后,一定会对其他线程可见,因此线程t2能够看到线程t1对变量x的修改,正确地输出变量x的值为1。

因此,JMM的可见性保证了一个线程对共享变量的修改对其他线程是可见的,从而避免了线程间的可见性问题,保证了程序在多线程环境下的正确性。