状態がいくつかのフィールドで構成される共有オブジェクトへのスレッド間のアクセスを同期する必要があります。言う:
class Shared{
String a; Integer b;
//constructor, getters and setters
....
}
私はおそらく多くのスレッドがこのオブジェクトを読んでいます。
//readers
shared.getA();
shared.getB();
特定の時点で書き込みを行うスレッドは 1 つだけです。
//writer
shared.setA("state");
shared.setB(1);
今私の質問は、読み取りスレッドが一貫性のない状態で共有オブジェクトを見つけないようにする方法です。
スレッド間の一貫性がvolatile
解決策であるという多くの回答を読みましたが、それが複数のフィールドでどのように機能するかはわかりません。例えば、それで十分ですか?
volatile String a; volatile Integer b;
別の解決策は、共有オブジェクトを不変にし、AtomicReference を使用することです。
AtomicReference<Shared> shared = ....
そして、ライターは参照を交換するだけです:
Shared prev = shared.get();
Shared newValue = new Shared("state",1);
while (!shared.compareAndSet(prev, newValue))
そのアプローチは正しいですか?ありがとう!
更新私の設定では、共有オブジェクトはから取得されるConcurrentHashMap<Id,Shared>
ため、コメントは、不変のアプローチを使用するか、共有の更新をすべて一緒に同期することであることに同意します。ただし、完全を期すために、上記の を使用した解決策ConcurrentHashMap<Id,AtomicReference<Shared>>
が実行可能か、間違っているか、または単に不必要であるかを知っておくとよいでしょう。誰でも説明できますか?ありがとう!