問題タブ [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 - 揮発性参照は、オブジェクトの内部状態が他のスレッドから見えることを本当に保証しますか?
「Java Concurrency in Practice」を読んでいるときに、次のことに出くわしました-
オブジェクトを安全に発行するには、オブジェクトへの参照とオブジェクトの状態の両方を同時に他のスレッドから見えるようにする必要があります。適切に構築されたオブジェクトは、次の方法で安全に公開できます。
- 静的初期化子からのオブジェクト参照の初期化。
- それへの参照を volatile フィールドまたは AtomicReference に格納します。
- それへの参照を、適切に構築されたオブジェクトの final フィールドに格納します。また
- それへの参照を、ロックによって適切に保護されたフィールドに格納します。
私の質問は - 2 番目のポイントは本当ですか? つまり、オブジェクトへの参照を揮発性参照に格納するだけで、オブジェクトの状態を他のスレッドから見えるようにすることはできますか? そうでない場合、上記の点を間違って読んでいますか?
java - java匿名内部クラスがRunnableおよび共有外部クラスオブジェクトを実装するのはスレッドセーフですか?
示されているコードのように、created-thread はメイン スレッド ステータス オブジェクトを共有しています。created-thread が「setStatus」を呼び出すと、CPU キャッシュ、メイン スレッド、created-thread がステータス オブジェクトを独自のキャッシュにロードするため、スレッド セーフではないと思います。メソッドはキャッシュデータのみを更新し、メインスレッドは現在更新されたデータを見ることができません。したがって、同期が必要です。私は正しく理解していますか?