JMM中保证了程序的有序性,即保证程序按照指定的顺序执行。以下是一个示例说明JMM的有序性:
假设有两个线程t1和t2,它们同时访问一个变量x和一个变量y,并且变量x的值会被线程t1修改,而变量y的值会被线程t2修改。代码如下:
public class Main {
public static int x = 0;
public static int y = 0;
public static void main(String[] args) throws InterruptedException {
Thread t1 = new Thread(() -> {
x = 1;
y = x;
});
Thread t2 = new Thread(() -> {
System.out.println("y = " + y + ", x = " + x);
});
t1.start();
t2.start();
t1.join();
t2.join();
}
}
在这个示例中,线程t1将变量x的值设为1,然后将其赋值给变量y;线程t2输出变量y和变量x的值。如果JMM不能保证程序的有序性,那么在线程t2执行时,有可能变量y的值还是0,因为线程t2可能在变量y被修改之前就输出了变量y的值。这就是典型的“重排序”(Reordering)问题。
然而,由于JMM保证了程序的有序性,即保证程序按照指定的顺序执行,线程t1修改变量x的值后,一定会将变量y的值设为1,然后才会进入线程t2,输出变量y和变量x的值。因此,JMM的有序性保证了线程t2输出的变量y的值一定是1,而不是0。
因此,JMM的有序性保证了程序按照指定的顺序执行,从而避免了线程间的重排序问题,保证了程序在多线程环境下的正确性。