sto*_*r96 1 java concurrency multithreading thread-safety happens-before
考虑以下代码。
public class Test {
private boolean running = false;
public void run() {
running = true;
}
public void test() {
boolean running1 = running;
boolean running2 = running;
System.out.println("running1: " + running1);
System.out.println("running2: " + running2);
}
}
Run Code Online (Sandbox Code Playgroud)
线程 A 调用run(),然后另一个线程 B 调用test()并且不应该有任何发生之前的关系。我知道不能保证线程 B 看到线程 A 所做的更改。但是这个程序的输出有没有可能是:
running1: true
running2: false
Run Code Online (Sandbox Code Playgroud)
是的,这是可能的,因为它没有被明确禁止。
的阅读running对于分配到running1和running2可以按任何顺序对于发生在对方,和读running2可以在第一后发生System.out.println。没有什么可以说任何一个读取都应该来自缓存或主内存。
基本上,它可以打印什么(以及为什么)是非常开放的。
| 归档时间: |
|
| 查看次数: |
65 次 |
| 最近记录: |