读取变量的多个线程

时间:2011-11-30 23:56:58

标签: java multithreading concurrency effective-java

我正在阅读Joshua Bloch撰写的“Effective Java Second Edition”,并且我对以下关于并发性的声明感到困惑 -

“语言规范允许读取或写入变量是原子的,除非变量是long或double类型[JLS,14.4.7]。换句话说,读取long或double以外的变量是gauranteed返回某个线程存储到该变量中的值,即使多个线程同时修改变量而没有同步也是如此。“

如果有人手头有书,请在第259页的最后一段说明。

即使多个线程正在修改它,引用的变量也不会总是有值吗?

3 个答案:

答案 0 :(得分:3)

你必须整体阅读这句话。在这里,让我为你改写:

“换句话说,读取long或double以外的变量是为了返回由某个线程存储到该变量中的值,即使多个线程同时修改变量而没有同步”

变为:

“我们假设变量不是long或double(因为那时特殊规则适用)。即使有多个线程同时修改变量而没有同步来保护它,那么变量总会有一个变量价值。

此值始终是其中一个线程写入的值之一。你将无法提前告诉哪一个,但它总是一个人写的价值。它永远不会是一个腐败的半价值。“

答案 1 :(得分:1)

如果你有多个线程在写入和读取一个double或long,而不是附加volatile关键字。 read可以获得以前从未写过的值。

原因是这些 8字节长而不是4字节长,所以你可以读取变量的新值的一半和旧值的另一半(可能不是那么简单)基于特定的体系结构,但这是一个想法),导致错误的读取从不写入它。

答案 2 :(得分:0)

他说变量将有一个值,但该值是非确定性的(由于并发线程对变量的操作)。