这个Q正在寻找关于Java如何使volatile
字段可见的具体细节。Java如何管理易失性字段的可见性?
Java中的volatile
关键字用于在完成对其的写入操作后,使该变量的读者“主动”可见的变量。这是发生之前关系的一种形式 - 使得写入结果暴露给访问该变量的内存位置以供某些用途的人。并且在使用时,对该变量进行读/写操作原子 - 对于long
& double
- 对于其他所有var类型的R/W已经是原子。
我期待找出Java那样做一个变量的值写入操作后看到什么呢?
例如:下面的代码是从this讨论其中一个答案:
public class Foo extends Thread {
private volatile boolean close = false;
public void run() {
while(!close) {
// do work
}
}
public void close() {
close = true;
// interrupt here if needed
}
}
读取和刻录布尔文字是原子。如果调用上述方法close()
,它是一个原子操作来设置的close
值作为true
即使未声明为volatile
。
更何况volatile
在此代码做的是确保更改这个值被认为是它发生的那一刻。
究竟如何volatile
是实现这一目标?
通过对volatile变量优先与操作的线程?如果是这样 - 在线程调度中如何执行,或者通过使读取操作的线程查找标志来查看是否有写入器线程挂起?我知道“写入一个易失性字段发生在每次后续读取该字段之前”。它是否在线程中进行选择,在给只读的线程提供CPU时间之前,它对volatile变量有一个写操作?
如果这是在线程调度级别(我怀疑)中进行管理,那么在易失性字段上运行写入线程会比看起来效果更大。
究竟是如何被管理的Java变量volatile
的知名度?
TIA。
它保证一个线程写入到volatile变量将写入主存储器,并而不是处理器缓存,并且读取volatile变量值的线程不会从处理器缓存中读取,而是从主存储器中读取。我不是这些低级硬件机制的专家, LL让专家回答,但你应该明白我的意思,与调度或优先级无关。 – 2014-10-05 16:55:37
的CPU完成所有的工作。在JVM确保它使用了正确的指示。 – 2014-10-05 17:36:01