- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在查看“Java Concurrency in Practice”一书,发现下面引用的陈述真的很难相信(但不幸的是它是有道理的)。
http://www.informit.com/store/java-concurrency-in-practice-9780321349606
只是想弄清楚这100%
public class Holder {
private int n;
public Holder(int n) { this.n = n; }
public void assertSanity() {
if (n != n)
throw new AssertionError("This statement is false.");
}
}
While it may seem that field values set in a constructor are the first values written to those fields and therefore that there are no "older" values to see as stale values, the Object constructor first writes the default values to all fields before subclass constructors run. It is therefore Possible to see the default value for a field as a stale value
关于上面加粗的语句,
我知道这种行为,但现在很明显构造函数的调用层次结构不能保证是原子的(在由锁保护的单个同步块(synchronized block)中调用 super 构造函数),但解决方案是什么?想象一个具有多个级别的类层次结构(即使不推荐,也可以假设)。上面的代码片段是我们每天在大多数项目中看到的一种原型(prototype)。
最佳答案
你看错书了。它明确地说:
The problem here is not the Holder class itself, but that the Holder is not properly published.
所以上面的构造如果没问题。不好的是不正确地将这样的对象发布到其他线程。书中对此进行了详细解释。
关于java - 对象创建(状态初始化)和线程安全,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19179907/
我是一名优秀的程序员,十分优秀!