シングルトンのダブルチェックロック
2023-11-29 21:34:04
質問
このコードでは、以下のようにダブルチェックロックを使用しています。私はいくつかのソースで多くの記事を読んだように、彼らは2つの同時実行スレッドが2つの異なるオブジェクトを作るのを防ぐため、ダブルチェックが有用であると言います。
public class DoubleCheckLocking {
public static class SearchBox {
private static volatile SearchBox searchBox;
// private constructor
private SearchBox() {}
// static method to get instance
public static SearchBox getInstance() {
if (searchBox == null) { // first time lock
synchronized (SearchBox.class) {
if (searchBox == null) { // second time lock
searchBox = new SearchBox();
}
}
}
return searchBox;
}
}
上記のコードはまだあまり理解できていません。インスタンスがnullのときに2つのスレッドが一緒に同じ行を実行すると、何が問題なのでしょうか?
if (searchBox == null) {
synchronized (SearchBox.class) {
if (searchBox == null) {
searchBox = new SearchBox();
}
}
}
これが表示されると、2つのスレッドはオブジェクトがnullであることを認識し、同期をとる。 もう一度確認すると、やはりNULLと表示されます。 .そして、2つの異なるオブジェクトを作成します。OOOPS。
私のために説明してください。私は何を間違って理解しているのでしょうか?
ありがとうございます。)
どのように解決するのですか?
いいえ、あなたは
SearchBox.class
にロックをかけているので、同期ブロックには一度に1つのスレッドしか入りません。ですから、最初のスレッドが入ると
searchBox
が NULL であることを発見し、それを生成して同期ブロックから離れ、次に 2 番目のスレッドがブロックに入ると
searchBox
が null でないことを発見します。
searchBox
.
ダブルチェックパターンは、コードを実行するたびにロックを取得することを避けるために使用されます。もし呼び出しが同時に行われない場合、最初の条件は失敗し、コード実行はロックを実行しないので、リソースを節約することができます。
関連
-
Springの設定でxsdファイルのバージョン番号を設定しない方が良い理由
-
ajax コミット リソースの読み込みに失敗しました: サーバーはステータス 400 で応答しました ()
-
無効なメソッド宣言
-
セミコロン期待値エラー解決
-
X11 DISPLAY変数が設定されていない」問題の解決方法
-
[解決済み] 静的クラスとシングルトンパターンの違い?
-
[解決済み] Pythonでシングルトンを作成する
-
[解決済み] デザインパターンについて。シングルトンはいつ使うべきですか?
-
[解決済み] Javaでsynchronized(this)を避けるには?
-
[解決済み】C++ シングルトンデザインパターン
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
executeQuery()でデータ操作文が発行できない。解決方法
-
JAVA_HOME環境変数が正しく定義されていない問題を解決する
-
Java Notes 005_この行に複数のマーカーがある - キーを変数に解決できない - シンタックスエラー、ins
-
BindException: アドレスはすでに使用中です:バインドエラー解決
-
セミコロン期待値エラー解決
-
eclipse 実行 Java、エラー: 選択を起動できず、レシーバーもありません。
-
[解決済み】JavaにおけるVolatileとStaticの比較
-
[解決済み] Kotlinのパラメータ付きシングルトン
-
[解決済み] スレッドセーフなC#シングルトンパターン
-
[解決済み] 二重チェックロックでvolatileを使用する理由