問題タブ [memory-visibility]
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 - ConcurrentHashMap の .compute() との同期は可視性を保証しますか?
内部でConcurrentHashMap.compute()
は、共有メモリにある long 値をインクリメントおよびデクリメントします。読み取り、インクリメント/デクリメントはcompute
、同じキーのメソッド内でのみ実行されます。そのため、long 値へのアクセスは ConcurrentHashMap セグメントをロックすることによって同期されるため、インクリメント/デクリメントはアトミックです。私の質問は: マップ上のこの同期は、長い値の可視性を保証しますか? Map の内部同期に依存できますか、それとも long 値にする必要がありますvolatile
か?
ロックで明示的に同期すると、可視性が保証されることを私は知っています。ConcurrentHashMap
しかし、私は内部を完全に理解していません。または、今日は信頼できるかもしれませんが、明日ConcurrentHashMap
の内部は何らかの形で変化する可能性があります。排他的アクセスは保持されますが、可視性は失われます...そして、長い値を揮発性にするための議論です。
以下に、簡単な例を投稿します。テストによると、今日は競合状態はありません。volatile
しかし、このコードをforなしで長期的に信頼できlong value
ますか?
UPD:私が取り組んでいるコードに近い別の例を追加します。誰もオブジェクトを使用していないときに、マップ エントリを削除したいと考えています。long 値の読み取りと書き込みは、次の再マッピング関数内でのみ行われることに注意してくださいConcurrentHashMap.compute
。
UPD2: 以前は最も単純なコード例を提供できなかったことを認め、実際のコードを投稿しました: