Вот как выглядит мой код:
private boolean[] isInitialized = new boolean[COUNT];
private void ensureInitialized(int i) {
if (! isInitialized[i]) {
initialize(i);
isInitialized[i] = true;
}
}
Теперь я хочу, чтобы это было поточно-ориентированным. Я знаю, что двойная проверка блокировки в Java - это «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 не нужно, поскольку переменная не изменяется, верно?
- Элементы массива изменены, как я могу сделать их изменчивыми?
- Есть ли вообще лучшие способы сделать это?
(Также обратите внимание, что это метод экземпляра, поэтому статический инициализатор работать не будет)