2017-04-06 10 views
1

で更新することができるとき、それは安全なハッシュマップの値の参照を使用することです。
そして、ときに私は、このようなパラメータは、それが、私は値が最新ではありません耐えることができるので、それは安全な<i>のgetParameter</i></p> <p>を使用することです別のスレッド

コードの最新の値を取得することができ、次の時間:

public class ParameterManager { 

    private volatile Map<String, Parameter> scenarioParameterMap = Maps.newHashMap(); 

    public ParameterManager(String appName) throws DarwinClientException { 
    } 

    public Parameter getParameter(String scenario) { 
     return scenarioParameterMap.get(scenario); 
    } 

    public void update(String scenario, Map<String, String> parameters) { 
     if (scenarioParameterMap.containsKey(scenario)) { 
      Parameter parameter = scenarioParameterMap.get(scenario); 
      parameter.update(parameters); 
     } else { 
      scenarioParameterMap.put(scenario, new Parameter(scenario, parameters)); 
     } 
    } 
} 

または更新したばかり

   scenarioParameterMap.put(scenario, new Parameter(scenario, parameters)); 

答えて

3

volatileを使用しているが、全くここには役立ちません。これは、そのマップの内容ではなく、scenarioParameterMapに保持されている参照のみを保護します。いつでも別のマップを指すように再割り当てしないので、volatileは無関係です。

このコードはではなく、 threadsafeです。​​、またはconcurrent mapなどの同等の方法を使用して、適切な同期を使用する必要があります。

私は値が最新ではないことを容認できるので、

スレッド非安全性は、それより危険な可能性があります。それは間違った結果を与える可能性があります。それはクラッシュする可能性があります。最悪の場合は古くなったデータだと考えることで、あなたは得ることができません。そうではありません。

Map.put()はマップの更新中であり、一時的に無効な状態の内部データがあるとします。 Map.get()が同時に実行されていて、何がうまくいかないかも知っている場合。ハッシュマップにエントリを追加すると、全体が再割り当てされ、再バケットされることがあります。その時に地図を読んでいる別のスレッドは非常に混乱しています。

+0

私はそれがスレッドセーフではないことを知っていますが、私がこのように使用すると、何らかの問題が生じる可能性がありますか?またはgetParameterは古いパラメータを取得するだけですか?次回は最新のパラメータを取得しますか? – bryantism

+0

@bryantismもし私たちがどこか昼食に行くなら、あなたのブレーキは安全ではないことを知っていると教えてください - それは私が知りたい情報ですが、私はあなたに運転させる**ではありません。 –

関連する問題

 関連する問題