什么是重排序
在Java 中,重排序是指的是Java 虚拟机对未同步的代码执行顺序进行更改。
其他的编程语言也有类似的特性,主要是因为编译器对代码进行优化而导致的。
例如以下代码:
private static int foo;
private static boolean;
public static void main(String[] args){
foo = 10;
flag = true;
}
foo
与 flag
没有直接的关系,JVM 很有可能将两行代码进行重新排序。
在单线程的情况下,这样的代码似乎没有什么问题。不过再看看多线程下,这样的代码会导致什么结果。
private static int foo;
private static boolean flag;
public static void main(String[] args){
new Thread(){
public void run(){
while(!flag)
Thread.yield();
System.out.println(foo);
}
}.start();
foo = 10;
flag = true;
}
这样的代码,就会导致结果不可知。因为JVM 有可能会把 foo = 10
和 flag = true
的顺序重新排序。
可能代码执行很多次都没有问题,但是一旦JVM 对代码进行重排序,将导致严重的后果。
而避免的方法就是对共享的数据进行同步。
网友评论