您的位置:首页 > 编程语言 > Java开发

Java Concurrency in Practice :基础知识(重排序与可见性)

2016-11-24 19:38 441 查看

重排序 与 可见性

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保持可见
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: