これは私のコードが現在どのように見えるかです:
private boolean[] isInitialized = new boolean[COUNT];
private void ensureInitialized(int i) {
if (! isInitialized[i]) {
initialize(i);
isInitialized[i] = true;
}
}
今、私はそれをスレッドセーフにしたいと思っています。Java での double-checked-locking は「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;
}
}
}
}
これを実際にスレッドセーフにするために何をしなければなりませんか?
いくつかのサブ質問:
- 変数は変更されないので、 volatile
isInitialized
にする必要はありませんね。 - 配列要素が変更されました。どうすればそれらを揮発性にできますか?
- 一般的にこれを行うためのより良い方法はありますか?
(また、これはインスタンス メソッドであるため、静的初期化子は機能しないことに注意してください)