問題タブ [double-checked-locking]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票する
2 に答える
135 参照

java - シングルトンの二重チェックは、壊れることなくうまく機能しているようです。なぜ、どのように?

コンストラクターが完全に実行されていなくても、参照が null ではない読み取りを行う JVM が続く一部のメモリ モデルが原因で、シングルトンの二重チェック メカニズムが失敗することを読みました。

以下のコードのコンストラクター内で時間のかかる操作を行って同じことをテストしようとしましたが、それでも正常に動作しているようです。

}

私が得る結果は 10 10 10 10 10 10 です

10 ではなく値 0 を読み取るスレッドはほとんどないと予想していましたが、値が 10 として正しく読み取られるたびに、Java SE-1.6 で同じものを使用しているため、問題は解決しましたか?

0 投票する
2 に答える
1325 参照

java - Future の ConcurrentHashMap とロックのダブルチェック

与えられた:

  • volatile遅延初期化シングルトン クラスはsynchronizedgetInstance. このシングルトンは、ExecutorService,を介して非同期操作を開始します
  • タスクには 7 つのタイプがあり、それぞれが一意のキーで識別されます。
  • タスクが起動されると、に基づいてキャッシュに保存されますConcurrentHashMap
  • クライアントがタスクを要求すると、キャッシュ内のタスクが完了すると、新しいタスクが起動されてキャッシュされます。実行中の場合、タスクはキャッシュから取得され、クライアントに渡されます。

コードの抜粋を次に示します。

1 つの大きな質問と、もう 1 つの小さな質問があります。

  1. getTaskメソッドでロック制御をダブルチェックする必要がありますか? 私ConcurrentHashMapは読み取り操作がスレッドセーフであることを知っているので、get(key)スレッドセーフであり、ロックのダブルチェックは必要ないかもしれません (しかし、これについてはまだよくわかりません…)。しかしisDone()、Future のメソッドはどうでしょうか。
  2. synchronizedブロック内の適切なロック オブジェクトをどのように選択しますか? であってはならないことがわかっているnullので、最初に のTaskLauncher.classオブジェクトを使用しgetInstance()、次にメソッドtasksCacheで既に初期化されているを使用しますgetTask(String key)。そして、この選択は実際に重要ですか?
0 投票する
1 に答える
377 参照

c# - C#ではなくJavaでのダブルチェックロックには「揮発性」が必要ですか?

ダブルチェック ロックが正しく機能するためには、変数を宣言する必要がvolatileあり、オブジェクトの初期化を同期するだけでは不十分であることは、Java プログラマの間ではよく知られています。

この認識はおそらく、volatileキーワードのセマンティクスが 1.5 で変更され、「前に発生する」関係を含むようになったためです。少なくとも部分的には、二重チェックのロックを安全にするためです。私が理解していることから、「前に起こる」関係は、揮発性変数に書き込むと、スレッド内のすべてのキャッシュされた変数がメインメモリに書き込まれ、揮発性変数から読み取った後、すべてのキャッシュされた変数は古いと見なされ、揮発性変数への書き込みの前に書き込まれたすべてが、その変数からの後の読み取りの「前に発生する」ことが保証されるように、メインメモリから再読み取りします。

スタック オーバーフローは、C# の場合、ダブルチェック ロックは不要であると考えているようですvolatile(これは特定の CPU または Microsoft の実装に固有のものである可能性があることに注意しているにもかかわらず)、Java のsynchronizedステートメントのセマンティクスはC#のステートメントとまったく同じlockであると考えています。このステートメントは、Java で特定されたのと同じ問題が C# にも存在することを示唆しています。

では・・・どれが正しい?C# でのダブルチェック ロックは、実際には Java よりも危険性が低いですか? もしそうなら、どの言語セマンティクスがそれを実現するのに違いますか?

そうでない場合、具体的に何が問題になる可能性がありvolatileますか? volatileC#のセマンティクスは、Java のような "前に発生する" 関係を確立しvolatileますか?

0 投票する
2 に答える
93 参照

java - HashMap による二重マッピング

私たちは、シングルトンを取得するためのコードに取り組んできました。クラスがコレクションに存在する場合はそれを返し、それ以外の場合は作成してコレクションに保存します。すべての get 操作で同期しないように、ダブルチェック ロックを使用します。

ただし、多くの記事によると、二重チェックのロックが壊れています。ただし、マップは既に初期化されており、内容のチェックが行われているため、これがここに当てはまるかどうかはわかりません。皆さんはどう思いますか?ここでダブルチェックロックを機能させる方法はありますか?

ありがとう

0 投票する
1 に答える
33 参照

performance - パフォーマンス テスト: ダブル チェック ロックを使用する場合と使用しない場合のシングルトン クラス

私はシングルトンクラスの2つの実装を持っています

と:

かかった時間の観点から私の発見をパラメータ化したいのですが、私がしたことはこれです:

私が得た結果は次のとおりです。

S1 にかかった時間 4636498 S2 にかかった時間 5127865

最初の質問はこれが正しいアプローチですか? getinstances次に、両方でメソッドにコメントを付けてもcall()、2 つの同一ブロックの実行時間が異なります。

S1 にかかった時間 1506640 S2 にかかった時間 2156172

0 投票する
1 に答える
182 参照

java - JAVA での二重チェック ロック

ウィキペディアで DCL について読んでいて、DCL の問題と提案された解決策について疑問に思っていました。つまり、なぜvolatileキーワードが必要なのですか? つまり、DCL を使用すると、部分的に構築されたオブジェクトがスレッドによって使用される場合があります。提案された解決策 (JAVA 5+ の場合):

volatileさて、私の質問は、 from ヘルパーをドロップしないのはなぜですか? 私が間違っている場合は訂正してくださいhelper = result = new Helper();

このシナリオではhelper、オブジェクトが完成するまで参照を取得できません。そうじゃない?どのようにvolatileうまくいっていますか?

編集:このコードを想定:

初期化後の次の行で完全に初期化されたオブジェクトが保証されない場合、そのオブジェクトに対してメソッドを呼び出すことはできません。できますか?