【发布时间】:2017-03-03 20:40:04
【问题描述】:
我想从 Java Concurrency in Practice 中理解这一行 -
无中生有的安全性是一种安全保证,即当一个线程在没有同步的情况下读取一个变量时,它可能会看到一个陈旧的值,但该值将是一个线程设置的值,而不是某个随机值。
随机值是什么意思?怎么会进入那种状态?一个伪代码示例会很有帮助。
【问题讨论】:
-
它无法进入那种状态。这就是您发布的sn-p所说的。您可以保证永远不会从值中读取随机值。它要么是当前的,要么是旧的,但不是没有线程曾经写入变量的值。
-
这只是说它保证是一个线程先前设置的值,它永远不会是一些未初始化的值,或者因为它被抢占而设置了一半的值。请参阅stackoverflow.com/questions/21243858/out-of-thin-air-safety,它解释说“有些架构将 64 位操作实现为 2 个可以中断的独立 32 位操作”
-
C 和 C++ 是两个。
-
@Julian 我链接的答案没有显示示例语言,但它会是单词写入不是原子的?
-
是的,Java,用于 64 位值。那是在您引用的 sn-p 之后立即解释的(尽管您可能看到的值并不是真正随机的。它是通过仅设置 64 位值中的 32 位获得的值)。
标签: java multithreading concurrency