【发布时间】:2013-10-04 11:18:46
【问题描述】:
我正在查看“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.");
}
}
虽然在构造函数中设置的字段值似乎是第一个 写入这些字段的值,因此没有“旧” 值被视为陈旧的值,首先是 Object 构造函数 将默认值写入子类之前的所有字段 构造函数运行。因此可以看到默认值 将字段作为陈旧值
关于上面的粗体声明,
我知道这种行为,但现在很明显,构造函数的这种调用层次结构不能保证是 ATOMIC(在由锁保护的单个同步块中调用超级构造函数),但解决方案是什么?想象一个具有多个级别的类层次结构(即使不推荐,让我们假设它是可能的)。上面的代码片段是我们在大多数项目中每天都能看到的一种原型。
【问题讨论】:
-
Java 中的多重继承是不可能的。在具有多重继承的语言中,有一些结构可以解决在两个或多个超类中具有相同字段的歧义。如果我们在讨论 Java,我仍然不明白“保证是 ATOMIC”是什么意思?
-
@M.Sameer 编辑了关于继承的正确措辞。意思是阶级层次不齐
-
上面的例子说明了什么?你是说你可能会从中得到 AssertionError 吗?这对我来说很难相信。
-
@JanZyka 这就是书中所说的,该声明是从书中引用的
标签: java inheritance concurrency