【发布时间】:2015-08-06 10:47:41
【问题描述】:
来自Javadocs
使用 volatile 变量可降低内存一致性的风险 错误,因为对 volatile 变量的任何写入都会建立 与后续读取相同的发生之前的关系 多变的。这意味着对 volatile 变量的更改总是 对其他线程可见。
当对 volatile 变量所做的更改始终对任何其他线程可见时,为什么在多个线程写入该变量的情况下不能使用 volatile 变量。为什么 volatile 仅用于一个线程正在写入或读取而另一个线程仅读取变量的情况?
如果更改总是对其他线程可见,那么假设如果线程 B 想要写入该变量,它将看到新值(由线程 A 更新)并更新它。而当线程A再次要写入时,它会再次看到线程B更新的值并写入它。问题出在哪里?
简而言之,我无法理解这一点。
如果两个线程都在读取和写入共享变量,那么 使用 volatile 关键字是不够的。你需要使用 同步在这种情况下,以保证读写 变量是原子的。
【问题讨论】:
-
没有一个线程必须是“仅”读取或写入。 reader 和 writer 的角色可以是“流利的”,并且可以有两个以上的线程参与这种交换。
-
如果一个线程写入一个值到一个变量,它什么时候看到(读取)一个值?请澄清你的最后一段。
-
@SotiriosDelimanolis,它不会看到,但会遇到它的更新值。所以它会写入更新的值。
-
@Thilo,这个答案说应该读一读。 stackoverflow.com/a/17748517/3292108
-
啊,那请看answer given by ruakh。该语句指的是一种模式,其中读取和写入都应作为单个外部可见操作以原子方式完成。
标签: java multithreading