这就是我的代码当前的样子:
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 ,因为变量不会更改,对吧? - 数组元素已更改,如何使它们变为 volatile ?
- 是否有更好的方法来做到这一点?
(另请注意,这是一个实例方法,因此静态初始化器将不起作用)
最佳答案
您还可以考虑使用Suppliers.memoize(Supplier<T> delegate)
来自guava library .
关于Java:如何对数组元素进行双重检查锁定?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3897202/