【发布时间】:2018-03-27 21:18:41
【问题描述】:
我正在阅读 Java 中的并发,包括 volatile 变量,例如这里:http://www.cs.umd.edu/~pugh/java/memoryModel/jsr-133-faq.html
下面这段话很有意思,但我还不太明白:
实际上,因为新的内存模型对 重新排序[通过例如处理器效率] 易失性字段访问与其他字段访问, volatile 与否,线程 A 在写入时可见的任何内容 到 volatile 字段 f 在读取 f 时对线程 B 可见。
我已经明白volatile 变量不能缓存在寄存器中,因此任何线程的任何写入都将立即被所有其他线程看到。同样根据这个 (https://docs.oracle.com/javase/tutorial/essential/concurrency/atomic.html) 对 volatile 变量的读取和写入是原子的(不确定这是否会包括像 x++ 这样的东西,但这与这篇文章无关)。
但我提供的报价似乎暗示了除此之外的一些东西。它表示线程 A 可见的 任何东西 现在对线程 B 可见。
所以只是为了确保我有这个权利,这是否意味着当一个线程写入一个 volatile 变量时,它会将其整个处理器寄存器完全转储到主内存?您能否提供更多关于如何以及为什么会发生这种情况的背景信息?它也可能有助于将其与同步进行比较/对比(它遵循类似的机制还是不同的机制?)。此外,示例永远不会对像这样复杂的事情造成伤害:)。
【问题讨论】:
-
您是想了解规范还是实现?
-
我想你可能会说我正在尝试理解规范,尽管以示例的方式提及规范实现的不同方式并没有什么坏处。
-
据我了解,如果 ThreadA 在 F 发布,而 ThreadB 在读取 volatile 后从 F 读取,则其他变量变为可见。
-
就规范而言,您的理解是正确的。在写入 volatile 变量之前,线程中的所有写入在读取同一变量后对另一个线程可见。同步具有类似的效果。请参阅Oracle tutorial 和JCIP 了解更多信息。
标签: java multithreading