据我所知volatile write 发生在 volatile read之前,所以我们总是会在 volatile 变量中看到最新的数据。我的问题基本上涉及“发生之前”一词以及它发生在哪里?我写了一段代码来澄清我的问题。
class Test {
volatile int a;
public static void main(String ... args) {
final Test t = new Test();
new Thread(new Runnable(){
@Override
public void run() {
Thread.sleep(3000);
t.a = 10;
}
}).start();
new Thread(new Runnable(){
@Override
public void run() {
System.out.println("Value " + t.a);
}
}).start();
}
}
(为清楚起见,省略了 try catch 块)
在这种情况下,我总是看到要在控制台上打印值 0。如果没有Thread.sleep(3000);
我总是看到值 10。这是发生在关系之前的情况,还是打印“值 10”,因为线程 1 更早地启动了线程 2?
很高兴看到每个程序启动时带有和不带有 volatile 变量的代码的行为都不同的示例,因为上面代码的结果仅取决于(至少在我的情况下)线程的顺序和线程休眠。