Oracle有关原子访问的文档(位于http://docs.oracle.com/javase/tutorial/essential/concurrency/atomic.html)说:
“一个易失性变量建立了一个事前发生的关系…。这意味着……当线程读取一个易失性变量时,它不仅看到了对易失性的最新更改,而且还看到了导致该代码的副作用改变。”
我无法解决这个问题。我了解volatile变量是如何工作的(在Java Java 5中),但是我想知道Java如何决定对volatile变量的更改有何副作用。
所以我想我的问题是:这种保证有哪些副作用?
编辑:
因此,我了解到,如果线程A修改了一个volatile变量,然后线程B读取了该变量,则在写volatile变量之前发生的所有线程A写入都相对于线程B是“一致的”(即,缓存的值)线程A进行上述写入的变量中的一部分在线程B中无效)。如我错了请纠正我。
大多数多处理器缓存都具有一致性机制,因此其代价不如刷新所有缓存那么糟糕。
在执行此操作之前,如果在该线程中写入了volatile的所有写入操作都将被该线程读取到volatile中看到。