他のすべてのアトミックオブジェクトと同じですか? AtomicIntegerの質問を説明する方が簡単です。 1つ以上のスレッドがmyIntへの参照にアクセスしているので、volatile宣言されていない限り、このオブジェクトに対して1つのスレッドが登録されたキャッシュされた値(nullなど)どうしてそんなに来ないの?AtomicReferenceをvolatileとして宣言する必要がありますか?
答えて
実際には意味的に間違っているだけでなく、実際には間違っています。 AtomicReference
は、 "本物の"参照をそれ自身の中に保持し、それ自身の同期構造を使用してそれへのアクセスを管理します。 JVMの独自の同期構造(,など)は使用されません。 AtomicReference
オブジェクト自体をvolatileとして扱うべきではありません。何かあれば、final
にすることを検討してください。
this question - volatile
は、取得と設定の操作がすべて必要な場合は、AtomicReference
を使用する代わりに使用することができます。
なぜですか?並行マップは正当な理由のために激しいフィールドによって保持される可能性がありますが、なぜこれが "アトミック"オブジェクトに当てはまるべきではないのでしょうか? –
@エヌノ:確かに、それが適切なシナリオを作ることができると思います。しかし、コード内で「揮発性AtomicReference」を見ることになっていた場合は、著者が意図したものではないでしょう。 – skaffman
@skaffman:確かに、AtomicReferanceは、それ自身の内部のターゲットオブジェクトへの実際の参照を保持していますが、このAtomicReferenceオブジェクトへの参照を参照しています。しかし、確かに私はそれを最終的にすることができ、それは完璧な意味もします。ありがとう! –
「アトミック」オブジェクトは不変ではないため、正しく公開されている場合にのみスレッドセーフでなければなりません。たとえば、このようなことをするときは、volatileキーワードを使用する必要があります。
volatile AtomicInteger counter = // initialize counter
int harvest(){
AtomicInteger old = counter;
counter = new AtomicInteger();
return old.get();
}
上記のコードからvolatileを削除すると、実際にはいくらかのインクリメントが失われる可能性があります。仕様によると、完全に構築されていないAtomicIntegerオブジェクトへの参照を取得し、未定義の動作を取得する可能性があります。
したがって、アトミックオブジェクトをvolatileとして宣言する必要がありますか?答えはそれが依存しているということです。他のスレッドセーフなオブジェクトと同じように、スレッドが適切に公開されている限り、スレッドセーフです(特殊オブジェクトである不変オブジェクトを除く)。ほとんどの場合、それらを最終的にする必要があります。
- 1. java - 共有リスナーメンバー変数をvolatileとして宣言する必要がありますか?
- 2. ロックはグローバルとして宣言する必要がありますか?
- 3. app.yamlでindex.htmlを宣言する必要がありますか?
- 4. スカラー値を宣言する必要がありますか?
- 5. スカラー変数を宣言する必要がありますか?
- 6. web.configでhttpsを宣言する必要がありますか?
- 7. Objective-C:プライベートメソッドを宣言する必要がありますか?
- 8. HttpServletクラスを抽象として宣言する必要はありますか?
- 9. インスタンス変数をvolatileとして宣言すると、このクラスのオブジェクトはvolatileになりますか?
- 10. スカラー変数を宣言する必要があります。
- 11. スカラー変数 "@UserName"を宣言する必要があります
- 12. Dapper ...スカラー変数を宣言する必要があります
- 13. テーブル変数 "@myTable"を宣言する必要があります
- 14. スカラー変数を宣言する必要があります@ DateField2
- 15. エラー:スカラー変数を宣言する必要があります
- 16. テーブル変数@tableを宣言する必要があります
- 17. 識別子 'UTILS.IDENTITY_VALUE'を宣言する必要があります
- 18. PLSQLエラー:コンポーネントを宣言する必要があります
- 19. テーブル変数を宣言する必要があります
- 20. このフィールドはvolatileにする必要がありますか?
- 21. デュアルOracleフォームで宣言する必要があります
- 22. スカラー変数を宣言する必要がありますが、宣言されました
- 23. コレクションクラスまたはインターフェイスを宣言する必要がありますか?
- 24. クラスはpublicであり、宣言する必要があります
- 25. テーブル変数とエラー "スカラー変数を宣言する必要があります"
- 26. 要素タイプ "hibernate-configuration"を宣言する必要があります
- 27. Hibernateエラー:org.xml.sax.SAXParseException:要素タイプ "hibernate-mapping"を宣言する必要があります
- 28. Android Studio、FileProviderの要素パスを宣言する必要があります
- 29. 要素web-appを宣言する必要があります(Servlet 4.0)
- 30. どこで静的変数を宣言する必要がありますか?
私はすべてのAtomicReferenceフィールドを最終的にしようとします。今までそれを変更する必要はありません。 –