我正在阅读有关 Javavolatile关键字的内容,并对它的“可见性”感到困惑。
volatile 关键字的典型用法是:
volatile boolean ready = false;
int value = 0;
void publisher() {
value = 5;
ready = true;
}
void subscriber() {
while (!ready) {}
System.out.println(value);
}
Run Code Online (Sandbox Code Playgroud)
正如大多数教程所解释的,使用 volatileready确保:
ready发布者线程对其他线程(订阅者)立即可见;ready的更改对其他线程可见时,任何之前的变量更新ready(这里是value的更改)也对其他线程可见;我理解第二个,因为volatile变量通过使用内存屏障来防止内存重新排序,所以在易失性写入之前的写入不能在其之后重新排序,并且在易失性读取之后的读取不能在其之前重新排序。这就是上面演示中ready防止 print = 0 的方法。value
但我对第一个保证感到困惑,即 volatile 变量本身的可见性。对我来说,这听起来是一个非常模糊的定义。
换句话说,我的困惑只是单个变量的可见性,而不是多个变量的重新排序或其他什么。让我们简化一下上面的例子:
volatile boolean ready = false;
void publisher() {
ready = true;
}
void subscriber() {
while (!ready) {}
} …Run Code Online (Sandbox Code Playgroud)