Jak*_*ski 8 java singleton multithreading idioms immutability
我有一种预感,即使用持有者习惯用语而不将持有者字段声明为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;
}
}
Run Code Online (Sandbox Code Playgroud)
编辑:我绝对想要源语句,而不仅仅是"它有效"的断言 - 请解释/证明它是安全的
EDIT2:稍加修改以使我的观点更清楚 - 我可以确定getAnswer()方法将返回21而不管调用线程吗?
ass*_*ias 16
在类的初始化程序保证,如果静态字段的值是使用静态初始化(即设置static variable = someValue;),该值是对所有线程可见:
10 - 如果初始化程序的执行正常完成,则获取LC,将C类的Class对象标记为完全初始化,通知所有等待的线程,释放LC,并正常完成此过程.
关于你的编辑,让我们想象一下两个线程T1和T2的情况,从挂钟的角度按顺序执行:
Something s = Something.getInstance();Something s = Something.getInstance(); i = s.getAnswer();然后你有:
Something INSTANCE = new Something();,初始化answer,T1释放LCINSTANCE然后读取读取answer.因此,您可以看到在写入和读取之间存在正确的发生关系answer,这要归功于LC锁定.
| 归档时间: |
|
| 查看次数: |
3304 次 |
| 最近记录: |