JMM 是否保证具有相同值的易失性覆盖最终将可见?

问题描述 投票:0回答:1

JMM 保证当线程 A 写入易失性变量 V 时,所有其他(非易失性)写入在线程 B 读取该 V 值后变得可见。

在存在多个易失性 V 覆盖具有相同值的情况下,该保证是否成立?

即考虑以下代码:

int x = 0;
int y = 0;
volatile int v = 0;

void fromThreadA() {
    x = 1;
    v = 0;

    y = 1;
    v = 0; // note that both writes to v never actually change its value
}

void fromThreadB() {
    while(v == 0) {
      if (x == 1 && y == 1) break;
    }
}

是否可以保证

fromThreadB
的调用者最终会终止?

java concurrency jvm volatile
1个回答
0
投票

这与是否“写入易失性变量 V...变得可见”无关。这都是关于“以前发生过的事情”。

线程 A 中对

x
y
的赋值都“发生在”第二次对
v
的赋值之前,因为所有这些赋值都发生在同一个线程中,并且同一线程中发生的事情总是按程序顺序发生.

同时,线程 B 从

v
读取。线程 A 中对
v
的赋值“发生在”线程 B 中的读取之前,因为 JMM 是这么说的。因此,一旦线程 A 调用了
fromThreadA()
函数,那么下一次线程 B 循环时,它必须看到
x==1
y==1

© www.soinside.com 2019 - 2024. All rights reserved.