【发布时间】:2010-10-09 17:51:59
【问题描述】:
这是我的代码目前的样子:
private boolean[] isInitialized = new boolean[COUNT];
private void ensureInitialized(int i) {
if (! isInitialized[i]) {
initialize(i);
isInitialized[i] = true;
}
}
现在我想让它线程安全。我知道 Java 中的双重检查锁定是“teh 3vilness!!1”,但由于ensureInitialized 可能经常被调用,我不希望它被同步。所以我正在考虑这样做:
private boolean[] isInitialized = new boolean[COUNT];
private void ensureInitialized(int i) {
if (! isInitialized[i]) {
synchronized (this) {
if (! isInitialized[i]) {
initialize(i);
isInitialized[i] = true;
}
}
}
}
现在我必须做些什么才能使这个线程真正安全?
一些子问题:
- 没有必要让
isInitializedvolatile,因为变量没有改变,对吧? - 数组元素发生了变化,如何让它们变得易变?
- 一般有更好的方法来做到这一点吗?
(还要注意这是一个实例方法,所以静态初始化器不起作用)
【问题讨论】:
标签: java multithreading arrays synchronized double-checked-locking