二重チェックのロック修正が機能しない方法についてはすべて読んだことがあり、遅延初期化は好きではありません。
これが私の例です: private int timesSafelyGotten = 0; プライベート ヘルパー ヘルパー = null;
public getHelper()
{
if (timesSafelyGotten < 1) {
synchronized (this) {
if (helper == null) {
helper = new Helper();
} else {
timesSafelyGotten++;
}
}
}
return helper;
}
このように、同期コードはヘルパーを作成するために 1 回実行し、最初に取得するときに 1 回実行する必要があるため、理論的には、ヘルパーを作成した同期コードがロックを解放し、ヘルパーの初期化が完了するまで、 timesSafelyGotten をインクリメントすることはできません。
問題はないと思いますが、あまりにも単純すぎて、本当であるとは思えません。どう思いますか?
カレブ・ジェームズ・デリスル