他のすべてのアトミックオブジェクトと同じですか? 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. web.configでhttpsを宣言する必要がありますか?
- 3. app.yamlでindex.htmlを宣言する必要がありますか?
- 4. Objective-C:プライベートメソッドを宣言する必要がありますか?
- 5. スカラー変数を宣言する必要がありますか?
- 6. HttpServletクラスを抽象として宣言する必要はありますか?
- 7. 識別子 'UTILS.IDENTITY_VALUE'を宣言する必要があります
- 8. テーブル変数@tableを宣言する必要があります
- 9. エラー:スカラー変数を宣言する必要があります
- 10. スカラー変数を宣言する必要があります。
- 11. スカラー変数 "@UserName"を宣言する必要があります
- 12. テーブル変数を宣言する必要があります
- 13. インスタンス変数をvolatileとして宣言すると、このクラスのオブジェクトはvolatileになりますか?
- 14. このフィールドはvolatileにする必要がありますか?
- 15. Hibernateエラー:org.xml.sax.SAXParseException:要素タイプ "hibernate-mapping"を宣言する必要があります
- 16. クラスがfinalとして宣言されている場合、メソッドをfinalとして宣言する必要があります。
- 17. どこで静的変数を宣言する必要がありますか?
- 18. Python3でエンコード宣言を使用する必要がありますか?
- 19. 関数宣言にパラメータ名を含める必要がありますか?
- 20. 私のC++インラインメソッドをインラインとして明示的に宣言する必要がありますか?
- 21. なぜC++テンプレートパラメータをクラス型として宣言する必要がありますか?関数テンプレートの
- 22. ネイティブモジュールはIIS7のグローバルモジュールで宣言する必要がありますか?
- 23. シングルトン内のメンバー変数は静的として宣言する必要がありますか?
- 24. (非並行)コレクションでvolatileを使用する必要がありますか?
- 25. Akkaのアクタのプロパティを@volatileにする必要がありますか?
- 26. PLS-00201:識別子 'D'を宣言する必要があります
- 27. イベントディスパッチスレッドで 'ローカル変数を最終宣言する必要があります'
- 28. PL/SQL識別子 'string'を宣言する必要があります
- 29. Spring LDAP ODM - エントリクラスを最終宣言する必要があります警告
- 30. forループの中でイテレータを宣言する必要はありますか?
私はすべてのAtomicReferenceフィールドを最終的にしようとします。今までそれを変更する必要はありません。 –