我一直在阅读有关volatile
在 Java 中使用变量的信息。我了解他们确保即时查看系统中运行在不同内核/处理器上的所有线程的最新更新。但是,不能确保导致这些更新的操作的原子性。我看到以下文献经常被使用
对 volatile 字段的写入发生在每次读取同一字段之前。
这是我有点困惑的地方。这是一段代码,可以帮助我更好地解释我的查询。
volatile int x = 0;
volatile int y = 0;
Thread-0: | Thread-1:
|
if (x==1) { | if (y==1) {
return false; | return false;
} else { | } else {
y=1; | x=1;
return true; | return true;
} | }
由于 x & y are both volatile
,我们有以下发生前的边缘
- 在 Thread-0 中写入 y 和在 Thread-1 中读取 y 之间
- 在 Thread-1 中写入 x 和在 Thread-0 中读取 x 之间
这是否意味着,在任何时候,只有一个线程可以在其“else”块中(因为写入会在读取之前发生)?
很有可能 Thread-0 启动,加载 x,发现它的值为 0,就在它即将在 else 块中写入 y 之前,有一个上下文切换到 Thread-1,它加载 y 发现它的值为 0因此也进入了 else 块。是否volatile
防止这种上下文切换(似乎不太可能)?