volatile 实现线程之间的可见性的示例如下:
import java.util.concurrent.TimeUnit;
public class volatileTest {
public static void main(String[] args) {
Data data = new Data();
new Thread(() -> {
try {
TimeUnit.SECONDS.sleep(1);
data.addPlusPlus();
} catch (InterruptedException e) {
e.printStackTrace();
}
}, "T1").start();
while (data.number == 0) {
//System.out.println(data.number); 注意这一行注释了
}
System.out.println("number > 0");
while (Thread.activeCount() > 2) {
Thread.yield();
}
}
}
class Data {
//volatile int number = 0;
int number = 0;
public void addPlusPlus() {
this.number ++;
}
}
当把
int number = 0;
改为
volatile int number = 0;
时确实实现了主线程打印结果
然而
当number
没有加 volatile
之前,while 循环中有注释的那一行时,主线程依然可以打印结果
这是为什么???
1
NullErro 2019-06-24 17:40:21 +08:00
你 start 之后暂停一段时间再看看是不是你这个结论呢,start()之后并不一定就立即启动 T1 这个线程了
|
2
momocraft 2019-06-24 17:44:42 +08:00
保证可见的反面是 “不保证可见” ,不是 “保证不可见”
|
3
superalsrk 2019-06-24 17:53:51 +08:00
2L 说的对
|
4
sagaxu 2019-06-24 17:54:47 +08:00 via Android 2
因为 System.out.println 里面有同步机制,基于 happens-before 的可传递性原则,你的代码执行之间也同步了
|
5
zjp 2019-06-25 00:47:56 +08:00 via Android
|