【发布时间】:2014-01-26 12:24:51
【问题描述】:
我有一种预感,使用 holder 惯用语而不将 holder 字段声明为 final 不是线程安全的(由于 Java 中不变性的工作方式)。有人可以证实这一点(希望有一些消息来源)吗?
public class Something {
private long answer = 1;
private Something() {
answer += 10;
answer += 10;
}
public int getAnswer() {
return answer;
}
private static class LazyHolder {
// notice no final
private static Something INSTANCE = new Something();
}
public static Something getInstance() {
return LazyHolder.INSTANCE;
}
}
编辑:我绝对想要来源声明,而不仅仅是“它有效”之类的断言——请解释/证明它是安全的
EDIT2:稍作修改以使我的观点更清楚 - 我可以确定无论调用线程如何 getAnswer() 方法都会返回 21?
【问题讨论】:
-
它完全是线程安全的,不管是否是最终的。
-
这个断言的来源?
-
Java 内存模型 - 我会回答...哎呀,太晚了:@assylias 已经为我完成了。
标签: java multithreading singleton immutability idioms