問題タブ [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.
c++ - C++ とダブルチェック ロックの危険性: 回避策?
「Scott Meyers によるダブル チェック ロックの危険性」に関する論文を読んでいました。http://www.aristeia.com/Papers/DDJ_Jul_Aug_2004_revised.pdf
著者は、ダブル チェック ロックが失敗する理由を示しています (ページ 3、セクション 4)。C++11 を使わずにこの問題を回避する方法を考えていました。C++ 11 を使用したくないというわけではありませんが、std::call_once などの関数を使用せずに解決できるかどうかを確認するだけです。
Singleton::instance() のコードはマルチスレッド環境で動作しますか? SeqAssign クラスのコンストラクターとデストラクタが呼び出される順序は決定論的です。
java - Java ダブルチェックロック、このコードは機能しますか?
「二重チェックのロックが壊れている」宣言を読みました。でも、関数でオブジェクトを作ってもいいのかな?
java - double-checked Locking が checkstyle から消えた - なぜ?
リリース ノートから、checkstyle は Double-Checked ロック チェックを削除しました。
なぜか理解に苦しむ。彼らは、リリース ノートだけでなく、イシュー トラッカーでも次のように回答しています。
Java 5 (およびそれ以降) と同様に DoubleCheckedLocking チェックを削除し、volatile キーワードを使用して問題に対処しました。
checkstyle がこの警告を削除している場合、それはもはや役に立たないためだと思います。つまり、エラーが発生しなくなるか、別の警告が機能します。しかし
なぜこのようなエラーが Java 5 で発生しなくなったのか、別の警告によってどのように補完されるのかわかりません。誰か説明してくれませんか?
編集: volatile キーワードを追加すると問題が解決することを理解しています。私の懸念は次のとおりです。この警告はまだ何らかの形で価値があるのではないですか? プログラマーが前述のロック パターンを使用しているが、変数 volatile を宣言するのを忘れている場合について考えています。checkstyle はまだそれについて警告すべきではありませんか?
c# - C#でのロックの再確認
アイデアは、から値(「データ」)を取得することです
- 変数
- 存在しない場合は、ファイルから
- 存在しない場合は、サーバーから
このコードは多くのスレッドで使用されています。スレッドセーフのように見えますが、実際にはそうではありません。私はそれをテストしたので、それは私にその考えを与え、私を確信させます。_data
書き込む前に、既存のものを再確認する必要があります。たとえば、通常はパターンシングルトンで使用されるダブルチェックのようにする必要があります。
誰かが私にそれをここで実装する方法を理解させてください?
編集:
EDIT2:
上記のコードは.NET<4.0で使用される可能性があるため、そこでLasyを使用することは許可されていません。私が今持っている唯一の質問は、ダブルチェックロックを使用する場合に備えて、揮発性を使用する必要があるかどうかです。
java - 壊れたダブルチェックロックを再現するテストを探しています
Javaで「壊れたダブルチェックロック」の問題を再現するテストを知っている人はいますか?
java - 無料の遅延初期化
二重チェックのロックイディオムに関する記事で、次の引用を見つけました。
同期なしで期待どおりに機能する遅延初期化の特殊なケースの 1 つは、静的シングルトンです。初期化されたオブジェクトが他のメソッドやフィールドを持たないクラスの static フィールドである場合、JVM は効果的に遅延初期化を自動的に実行します。
なぜ強調した部分が重要なのですか?他のメソッドやフィールドがあるとうまくいかないのはなぜですか?
(記事はすでに10年以上前のものです。情報はまだ関連していますか?)
java - JIT はバイトコードの実行をどのようにスケジュールしますか?
たとえば、次のコードがあります。
実際には次の 3 つの手順でバイト コードにコンパイルします。
ここで、construct(mem) が非常に遅い場合、JIT は mem が完全に構築されるまでステップ 2 で待機するのでしょうか?
待たない場合(非同期)
それでは、使用前にメモリが完全に構築されていることをどのように保証できますか(シングルスレッド)?
待機する場合(同期)
では、なぜダブル チェック ロック (以下のコードとこの記事を参照) が失敗するのでしょうか?
私が参照した記事では、上記のコードが完全に構築されていないインスタンスを返すことを指摘しています。
java - Javaダブルチェックロックソリューション?
これは、 Java 二重チェック ロックからのフォローアップです。
次のコード スニペットには、2 つの興味深い特徴があります。
1) オブジェクトを使用する準備が整う前に、別の init() メソッドを呼び出す必要があります。そのため、volatile は役に立ちません (わかっています。コードを単に init() のコンストラクターに入れてみませんか?説明のためにここに示しています)。
2) tmp 変数を使用して初期化を行い、初期化の完了後にインスタンスに割り当てます。
では、これは並べ替えの問題の影響を受けますか。つまり、インスタンスが tmpInstance.init() が呼び出される前に tmpInstance に割り当てられる可能性はありますか?
ありがとう、リッチ
java - 二重チェック ロックによる読み取り/書き込みロックの実装
私は、読者が二重チェックのロックを使用して書き込みロックを取得する Java ReadWriteLock を作成しました。これは安全ではありませんか (遅延インスタンス化を使用した DCL の場合と同様)?
Java には既に ReentrantReadWriteLock があることを知っています。DCL のどの形式が安全かどうかを判断する方法についての一般的な質問に興味がありますか?