-2

どうやって

私はこのクラスを持っているとしましょう

@ImmutableWannabe
public class ConfigurationHolder {
  @ImmutableButHowToMakeSureNoTwoThreadsOverrideOneEachOtherWhenReplacingReference
  private Map<System, Configuration> mySysConfig  = ImmutableMap.builder<>getSomeConfigurations....build();
  ConfigurationHolder(copy constructor) {
     mySysConfig = ImmutableMap.builder().of(inputSysConfig);
  }
}

ここで、システム構成の 1 つが更新され、このマップを更新する必要があるとしましょう。ただし、スレッド セーフな方法で更新する必要があります。つまり、2 つのスレッドが同じシステム データの同じ構成を更新しようとする場合、一貫性が保たれ、互いにオーバーライドされないようにする必要があります。

不変性はここでどのように役立ちましたか? 私が見る限り、ロックを行う必要がある場合は、適切に行う方法を教えてください。

したがって、私の一般的な質問は次のとおりです。システム時間の経過とともに変化する可能性のある immutableObject により、その ImmutableObjectHolder を変更する必要があるコードをロックする必要があるのではないでしょうか? 理解できません...

ImmutableMap +そのマップのホルダー+内部マップの更新でこのImmutableMapHolderを更新することを知っている適切な「クライアント」コードの適切な例を誰かが教えてください。

ありがとう

4

1 に答える 1

1

マップがインスタンス変数であると仮定すると、マップを作成する最も簡単な方法volatileです。または、ゲッターとセッターを作成して作成しますsynchronized。つまり、標準的な手法を使用します。また、クライアントが賢く、値をローカル変数にキャッシュしようとすると、これは役に立たないことに注意してください。(私はこのバグで数回噛みました。)

別の方法として、MyImmutableChangedイベント/リスナーを設定できると思います。

そして、あなたは正しいです、不変性はすべてのスレッドの問題を解決するわけではありません。

于 2013-01-29T06:49:39.380 に答える