【发布时间】:2010-12-09 22:28:46
【问题描述】:
阅读《Java并发实战》,第3.5节有这部分:
public Holder holder;
public void initialize() {
holder = new Holder(42);
}
除了创建两个Holder 实例存在明显的线程安全隐患之外,该书还声称可能会出现发布问题。
此外,对于 Holder 类,例如
public Holder {
int n;
public Holder(int n) { this.n = n };
public void assertSanity() {
if(n != n)
throw new AssertionError("This statement is false.");
}
}
可以抛出AssertionError!
这怎么可能?我能想到的唯一允许这种荒谬行为的方法是,如果 Holder 构造函数不会阻塞,那么将创建对实例的引用,而构造函数代码仍在不同的线程中运行。
这可能吗?
【问题讨论】:
-
这意味着对象中的所有字段都必须是最终的。无论如何我可以证明自己这可能发生。我试过了请帮忙
标签: java concurrency thread-safety