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 循环中有注释的那一行时,主线程依然可以打印结果
这是为什么???
这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。
V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。
V2EX is a community of developers, designers and creative people.