小编han*_*uan的帖子

了解 Java 易失性可见性

我正在阅读有关 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)

java multithreading caching volatile

6
推荐指数
1
解决办法
1102
查看次数

标签 统计

caching ×1

java ×1

multithreading ×1

volatile ×1