【发布时间】:2012-06-15 13:45:22
【问题描述】:
前几天 Howard Lewis Ship 发表了一篇名为 "Things I Learned at Hacker Bed and Breakfast" 的博客文章,其中一个要点是:
一个 Java 实例字段,通过惰性只分配一次 初始化不必是同步的或易失的(只要 因为您可以接受跨线程的竞争条件以分配给 场地);这是来自 Rich Hickey
从表面上看,这似乎与公认的关于跨线程内存更改可见性的智慧不一致,如果这在 Java Concurrency in Practice 一书或 Java 语言规范中有所涉及,那么我错过了它。但这是 HLS 在 Brian Goetz 出席的一次活动中从 Rich Hickey 那里得到的东西,所以看起来肯定有什么东西。有人可以解释一下这句话背后的逻辑吗?
【问题讨论】:
-
不要害怕易失性读取。类初始化,即可修改的代码是唯一可移植的方式来做到这一点,没有易失性。面对允许重新排序写入的 CPU 架构,该声明是不正确的。在 x86 和 Sparc TSO 上,易失性读取是免费的,因此没有必要扮演黑客。
标签: java multithreading concurrency