这是我的代码目前的样子:
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;
}
}
}
}
现在我该怎么做才能使这个真正的线程安全?
一些子问题:
- 没有必要制作
isInitialized
volatile,因为变量没有改变,对吧? - 数组元素发生了变化,我怎样才能让它们变得易变?
- 通常有更好的方法来做到这一点吗?
(还要注意这是一个实例方法,所以静态初始化器将不起作用)