重排序 与 可见性
1、小段代码片
public class NoVisibility{
private static boolean ready;
private static int number;
private static class ReaderThread extends Thread{
public void run(){
while(!ready)
Thread.yield();
System.out.println(number);
}
}
public static void main(String[] args){
new ReaderThread().start();
number = 42;
ready = true;
}
}
2、输出结果解释
结果一:持续循环
结果二:
输出为0(此处发生了
重排序)
3、如何防止错误结果的发生(加锁与可见性)
仅以volatile为例
public class Visibility{
private static volatile boolean ready;
private static int number;
private static class ReaderThread extends Thread{
public void run(){
while(!ready)
Thread.yield();
System.out.println(number);
}
}
public static void main(String[] args){
new ReaderThread().start();
number = 42;
ready = true;
}
}
4、输出结果分析
42 :给ready设置volatile属性,使
读写线程对ready保持
可见