我正在阅读Joshua Bloch撰写的“Effective Java Second Edition”,并且我对以下关于并发性的声明感到困惑 -
“语言规范允许读取或写入变量是原子的,除非变量是long或double类型[JLS,14.4.7]。换句话说,读取long或double以外的变量是gauranteed返回某个线程存储到该变量中的值,即使多个线程同时修改变量而没有同步也是如此。“
如果有人手头有书,请在第259页的最后一段说明。
即使多个线程正在修改它,引用的变量也不会总是有值吗?
答案 0 :(得分:3)
你必须整体阅读这句话。在这里,让我为你改写:
“换句话说,读取long或double以外的变量是为了返回由某个线程存储到该变量中的值,即使多个线程同时修改变量而没有同步”
变为:
“我们假设变量不是long或double(因为那时特殊规则适用)。即使有多个线程同时修改变量而没有同步来保护它,那么变量总会有一个变量价值。
此值始终是其中一个线程写入的值之一。你将无法提前告诉哪一个,但它总是一个人写的价值。它永远不会是一个腐败的半价值。“
答案 1 :(得分:1)
如果你有多个线程在写入和读取一个double或long,而不是附加volatile
关键字。 read可以获得以前从未写过的值。
原因是这些 8字节长而不是4字节长,所以你可以读取变量的新值的一半和旧值的另一半(可能不是那么简单)基于特定的体系结构,但这是一个想法),导致错误的读取从不写入它。
答案 2 :(得分:0)
他说变量将有一个值,但该值是非确定性的(由于并发线程对变量的操作)。