Java易失性和副作用

B T*_*B T 6 java concurrency atomic side-effects volatile

Oracle关于原子访问的文档(http://docs.oracle.com/javase/tutorial/essential/concurrency/atomic.html)说明了这一点:

"一个volatile变量建立一个发生在之前的关系......这意味着......当一个线程读取一个volatile变量时,它不仅会看到volatile的最新变化,还会看到导致代码的副作用改变."

我无法绕过那个头.我理解volatile变量是如何工作的(在> = Java 5中),但是我想知道java如何决定哪些副作用"导致"变化为volatile变量.

所以我想我的问题是:这种保证有哪些副作用?

编辑:

所以我已经知道如果线程A修改了一个volatile变量,然后线程B读取它,那么在写入volatile变量之前发生的所有线程A的写入都与线程B"相关"(即缓存的值)由线程A进行的前述写入的变量在线程B)中无效.如我错了请纠正我.

Tom*_*ine 5

大多数多处理器缓存都具有一致性机制,因此其代价不如刷新所有缓存那么糟糕。

在执行此操作之前,如果线程中对volatile进行的任何写操作都会被该线程读取volatile所看到。