問題タブ [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.
java - Java でダブル チェック ロック シングルトンを使用してクラスを拡張する
私は次のようなクラスを持っています:
ここでは、クラスのインスタンスを作成し、プロパティで同期しclass
ます。
私のプロジェクトにはそのようなクラスがたくさんあります。メソッドを実装する基本クラスを作成するgetInstance
方法があるので、すべてのクラスでこのコードを保持する必要はありませんか? ジェネリックを使用してみましたが、うまくいきませんでした。多分私が達成しようとしていることの例がありますか?
java - 最終変数が機能していることを再確認します
遅延初期化と、作成がスレッドセーフである必要のないオブジェクトの格納用に設計されたクラスがあります。コードは次のとおりです。
ここで、final
変数tmpRef
は、作成されたオブジェクトを格納してから、チェックされた変数に割り当てるために使用されますobject
。これはテストでは機能しますが、確実に正しいとは言えず、コンパイラによって最適化されません。このアプローチを使用できますか、またはobject
フィールドを次のように宣言する必要がありますvolatile
か?
また、ラッパー クラスを使用したバリアントは、行が
これに置き換える必要があります:
ラッパー クラスは次のようになります。
この例のいくつかは、マルチスレッド環境で安全に使用できますか (特に final ローカル フィールドを持つバリアント)?
java - 通常の HashMap による二重チェック ロック
並行性に戻ります。double checked locking
が機能するには、変数を として宣言する必要があることは明らかですvolatile
。しかし、以下のようにダブルチェックロックを使用するとどうなるでしょうか。
通常のHashMapではなく、実際にConcurrentHashMapである必要があるのはなぜですか? すべてのマップの変更はブロック内で行われ、コードは反復子を使用しないため、技術的には「同時変更」の問題はありません。synchronized
API の使用ではなく概念について質問しているため、 putIfAbsent
/の使用を提案しないでください:) この API の使用がvsの主題に寄与しない限り。computeIfAbsent
HashMap
ConcurrentHashMap
2016-12-30 更新
この質問は、以下の Holger によるコメントによって回答されました。「HashMap.get
構造は変更されませんが、あなたの の呼び出しは変更されます。同期ブロックの外側で のput
呼び出しがあるため、操作の不完全な状態が同時に発生していることがわかります。」ありがとう!get
put
java - Java 二重チェック ロック - 初期化メソッド
例を考えてみましょう:
この場合、揮発性は必要ですか?
java - 2 つの同期ブロックを持つ DCL が壊れていますか?
以下の A fix that doesn't work のコード スニペットを理解できませんでした。(同じページに続く説明を読みました)。
2 つの同期ブロックがある場合、この DCL バージョンはどのように壊れていますか? または、Java5以降は適用されませんか?