変更可能なアトミック参照は悪い考えですか?
絶対にありません!AtomicReference
基になる参照のスレッドセーフでアトミックな更新を提供するように設計されています。実際、AtomicReference の Javadoc の説明は次のとおりです。
アトミックに更新できるオブジェクト参照。
したがって、それらは間違いなく変異するように設計されています!
これは安全ですか?
「安全」の意味と、コードの残りの部分が何をしているかによって異なります。コードのスニペットを分離することについて、本質的に危険なことは何もありません。少し変わっているかもしれませんが、AtomicReference で同期することは完全に有効です。このコードに慣れていない開発者として、同期がオンになっているのを見reference
て、基になるオブジェクトがいつでも置き換えられる可能性があることを意味し、コードが常に「最新」の参照で動作していることを確認したいと思います。
同期の標準的なベスト プラクティスが適用され、それらに違反すると、安全でない動作が発生する可能性があります。たとえば、performSomeModification()
はスレッドセーフではないと言っているので、 で同期せずに基になるオブジェクトに別の場所でアクセスすると安全ではなくなりますreference
。
public void bar(AtomicReference reference) {
// no synchronization: performSomeModification could be called on the object
// at the same time another thread is executing foo()
reference.get().performSomeModification();
}
アプリケーションで一度に操作できるのは基になるオブジェクトのインスタンスを 1 つだけにする必要があり、参照を .set() するときに同期していない場合も、「安全ではない」可能性があります。
public void makeNewFoo(AtomicReference reference) {
// no synchronication on "reference", so it may be updated by another thread
// while foo() is executing performSomeModification() on the "old" reference
SomeObject foo = new SomeObject();
reference.set(foo);
}
AtomicReference で同期する必要がある場合は、そうしてください。完全に安全です。ただし、なぜそれを行っているのかについて、いくつかのコード コメントを追加することを強くお勧めします。