Dar*_*ert 7 java multithreading java-memory-model
考虑下面的Java示例.请注意,两个类成员变量都没有声明为volatile.如果我正在理解内存模型并且"之前发生"规则正确,那么Java实现可以优化该run()方法,以便它永远运行,即使另一个线程调用该stopNow()方法.这可能发生,因为run()方法中没有任何内容强制线程stop多次读取值.那是对的吗?如果没有,为什么不呢?
class Example implements Runnable {
boolean stop = false;
int value = 0;
public void stopNow() {
stop = true;
}
public int getValue() {
return value;
}
@Override
public void run() {
// Loop until stop is set to true.
while (!stop) {
++value;
}
return;
}
}
Run Code Online (Sandbox Code Playgroud)
可以由另一个线程修改,但这不是保证。这也不是线程安全的。要保证变量可以从另一个线程查看,您需要执行以下任一操作
\n\n\n\n\n仅在以下条件下,保证一个线程对字段所做的更改对其他线程可见:
\n\n\n
\n- 写入线程释放同步锁,读取线程随后获取相同的同步锁。
\n- 如果一个字段被声明为易失性,则在写入器线程
\n
执行任何进一步的内存操作之前,写入该字段的任何值都会被写入器线程刷新并使其可见(即,出于当前的目的,
它会立即刷新)。读取器线程必须
在每次访问时重新加载易失性字段的 \n 值。- 线程第一次访问对象的字段时,它会看到该字段的初始值或自某个其他线程写入以来的值。
\n- 当线程终止时,所有写入的变量都会刷新到主内存。例如,如果一个线程使用 Thread.join 在另一线程终止时进行同步,则可以保证看到
\n
该线程产生的效果(请参阅 \xc2\xa74.3.2)。
有帮助的线程
\n