問題タブ [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 投票する
3 に答える
9482 参照

java - 実際の Java アプリケーションにおけるシングルトン パターンと破損したダブル チェック ロック

Double-checked locking and the Singleton patternの記事を読んでいて、二重チェックのロックがどのように壊れているか、およびスタック オーバーフローに関するいくつかの関連する質問を読んでいました。

このパターン/イディオムを何回も問題なく使用しました。私は Java 5 を使用して以来、これが Java 5 メモリー・モデルで修正されたのではないかと最初に考えました。ただし、記事には次のように書かれています。

この記事では、Java 5.0 用に改訂される前の Java メモリ モデルについて言及しています。メモリの順序付けに関するステートメントは、もはや正しくない可能性があります。ただし、ダブルチェック ロックのイディオムは、新しいメモリ モデルではまだ壊れています

これは本当の問題ですか? もしそうなら、どのような状況下で?

0 投票する
5 に答える
3859 参照

c# - Dictionary の TryGetValue を使用した二重チェック ロック パターンがスレッドセーフではないことを示す方法

最近、Dictionary. このようなもの:

(ロックの外側で) がコレクションを反復処理している間Dictionaryにコレクションが「成長」する可能性があるため、このコードは正しくありません。多くの状況では非常にありそうもないかもしれませんが、それでも間違っています。_cache.Add()_cache.TryGetValue

このコードが失敗することを示す簡単なプログラムはありますか?

これを単体テストに組み込むことは理にかなっていますか? もしそうなら、どのように?

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

objective-c - ダブルチェックロック-Objectivec

Javaではメモリモデルが原因でダブルチェックロックに欠陥があることに気付きましたが、これは通常、シングルトンパターンに関連付けられており、シングルトンの作成を最適化します。

この場合、Objective-cではどうでしょうか。

アプリケーションがデータをストリーミングしているかどうかを判断するためのブールフラグがあります。startStreaming、stopStreaming、streamingDataReceivedの3つのメソッドがあり、以下を使用して複数のスレッドからそれらを保護します。

このダブルチェックは不要ですか?ダブルチェックには、JavaScriptと同様のObjective-cの問題がありますか?このパターン(アンチパターン)の代替手段は何ですか。

ありがとう

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

c# - 読み込みが失敗する可能性がある場合のスレッドセーフな遅延読み込み

私は、達成しようとしていることについての合意を探すのに約 1 時間費やしてきましたが、特定の方向で決定的なものをまだ見つけていません。

私の状況は次のとおりです。

  • マルチスレッド アプリケーション (.NET Web サービス) を使用しています。
  • ロードに無視できない時間がかかるオブジェクトを使用するクラスがあるため、それらを静的クラス メンバーとして維持したいと考えています。
  • これらのオブジェクトを断続的に構築するコードは、失敗する可能性が低い

以前は、静的コンストラクターでこれらのオブジェクトを構築するアプローチを使用していました。これに関する問題は、前述のように、コンストラクターが失敗することがあり、.NET 静的コンストラクターが失敗すると、プロセスが再起動されるまでクラス全体が停止することでした。そのアプローチには二度目のチャンスはありません。

この後、最も直感的に見えるアプローチは、ダブルチェック ロックを使用することでした。ダブルチェックされたロックの悪さについて話し、静的コンストラクターを使用するように言うページがたくさんありますが、これは私がすでに行っていましたが、静的コンストラクターには失敗してクラス全体がダウンする可能性があります。

私が使用しようと考えている実装(もちろん簡略化されたもの)は次のとおりです。すべてのクラスとメンバーの名前は純粋に説明的なものであり、私が実際に使用しているものではありません。このアプローチは問題になるでしょうか?誰でもより良いアプローチを提案できますか?

0 投票する
7 に答える
718 参照

c++ - C++ での二重チェック ロック: 一時ポインターに新規作成し、それをインスタンスに割り当てます。

次の Singleton 実装に何か問題がありますか?

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

c++ - たぶん(...そうです)解決しました:C ++でのダブルチェックロック:一時ポインターに新しく、それをインスタンスに割り当てます

これは、二重チェック ロックに関するこの投稿のフォローアップです。「古い」投稿にフォローアップを投稿しても、新しい投稿を送信するほど表示/アクティブにならないように思われるため、新しい投稿を書いています。おそらく、ほとんどの人がスタックオーバーフローの投稿をアクティビティのレベルで並べ替えていないためです。 .

回答者の皆様、元の投稿へのご意見ありがとうございます。Joe Duffy の優れた「Concurrent Programming on Windows」を参照した後、以下のコードを使用する必要があると考えています。一部の変数の名前変更と InterlockedXXX 行を除いて、これは彼の本のコードとほとんど同じです。次の実装では以下を使用します。

  1. 一時ポインターと「実際の」ポインターの両方にvolatileキーワードを追加して、コンパイラーからの並べ替えから保護します。
  2. CPUからの並べ替えから保護するためのInterlockedCompareExchangePointer

だから、それはかなり安全なはずです(...そうですか?):

0 投票する
7 に答える
459 参照

java - 二項係数の成長可能な配列のダブルチェックロック

二項係数の配列を維持するためにダブルチェック ロックを使用しようとしていますが、ダブルチェック ロックが機能しないことを最近読みました。効率は非常に重要であるため、条件ステートメント内でのみ使用しない限り、volatile を使用することはできません。シングルトンオブジェクトで静的クラスを使用する方法がわかりません(これはフレームワークの一部であり、関数を使用する必要がある数値の種類がわからないため、最大値を推測できません選択された値は、または関数がまったく使用されるかどうか)。私が考えることができる唯一のことは、すべてを静的ではなく、このメソッドを使用する必要がある各スレッドが独自の配列で Choose オブジェクトをインスタンス化することを主張することです。それは必要ではないようです。

0 投票する
5 に答える
2451 参照

java - Java Synchronized キーワードはキャッシュをフラッシュしますか?

Java 5 以降のみ。マルチプロセッサの共有メモリ コンピューターを想定します (おそらく、現在使用しているコンピューターの 1 つです)。

シングルトンの遅延初期化のコードは次のとおりです。

オプティマイザーが次のように getInstance() を書き換えないようinstanceに宣言する必要があります (順次プログラムでは正しいでしょう)。volatile

オプティマイザがコードを書き直さないと仮定すると、instance宣言されていない場合でも、ブロックが終了volatileしたときにメモリにフラッシュされ、ブロックが入力されたときにメモリから読み取られることが保証されますか?synchronizedsynchronized

編集: getInstance() を静的にするのを忘れていました。それが答えの妥当性を変えるとは思いません。あなたは皆、私が何を意味するかを知っていました。

0 投票する
7 に答える
2823 参照

java - ダブルチェックロックパターン:壊れているかどうか?

パターンが壊れていると見なされるのはなぜですか? それは私にはうまく見えますか?何か案は?

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

java - Java:配列要素でダブルチェックロックを行う方法は?

これは私のコードが現在どのように見えるかです:

今、私はそれをスレッドセーフにしたいと思っています。Java での double-checked-locking は「teh 3vilness!!1」であることは知っていますが、ensureInitialized非常に頻繁に呼び出される可能性があるため、同期させたくありません。だから私はこれを行うことを考えています:

これを実際にスレッドセーフにするために何をしなければなりませんか?
いくつかのサブ質問:

  • 変数は変更されないので、 volatileisInitializedにする必要はありませんね。
  • 配列要素が変更されました。どうすればそれらを揮発性にできますか?
  • 一般的にこれを行うためのより良い方法はありますか?

(また、これはインスタンス メソッドであるため、静的初期化子は機能しないことに注意してください)