多线程的debug是很困难的,尤其是那种不是每次都发生的错误 [其他解释] c = b; // 对 “引用变量” b 的读操作
以上语句算原子访问吗? [其他解释]
是的 [其他解释] c = b; // 对 “引用变量” b 的读操作
这条语句既包括对b的读,又包括对c的写 [其他解释] Oracle网站上是这样讲的:
However, there are actions you can specify that are atomic: Reads and writes are atomic for reference variables and for most primitive variables (all types except long and double).
没讲清楚还是偶的理解能力太差? [其他解释]
如果你把它拆开:
线程一从 b 读取值 线程一向 c 写入值
然后下面这两种有没有区别:
第一种: 线程一从 b 读取值 线程二向 b 写入新的值 线程一向 c 写入值
第二种: 线程一从 b 读取值 线程一向 c 写入值 线程二向 b 写入新的值
有没有区别? “线程二向 b 写入新的值”,到底有没有破坏 c = b; 的原子性? 取决于你对这里的原子性如何定义
在我看来 “线程二向 b 写入新的值” 更像是 b 的 “可见性” 没有保证,因为 —— c 没有得到 b 的最新值。 对变量 b 加 volatile 修饰来保障其可见性,就解决了这个问题。
[其他解释]
这里讲的 “读和写” 都是指的单个操作,单个的读操作,和单个的写操作。 [其他解释]
然后,我觉得“从 b 读取值” 和 “向 c 写入值” 更像是一个操作,“读取值”可以想象为瞬间完成的,这个操作可以描述为“向c写入b的值”,问题仅在于这里得到的“b的值”是不是最新的。 [其他解释] 谢谢指教! 您说的好像和Oracle网站上的教程差不多