08/05/18 01:32:46
>>260
>・ラップするクラスには、put と get のメソッドを作る
putとgetだけを提供する場合、
>if ( list.contains(x) == false ) list.add(x);
のような問題は相変わらず回避できないことに注意。
まぁ用途次第かもしれないので、わかってればかまわない。
>・HashMap にしておき、ラッパクラスの put メソッドは、内部で synchronized (myMap) { } ブロックで囲み、
>get メソッドは synchronized をつけなければ、取得時の同時並行性は確保できると思いました。
それはだめ。
変更(put)中のデータを参照(get)すると不正な結果を得たり死んだりする可能性がある。
もっと不可解なことが起きる可能性もあるけど、詳細は件の本でも読んでください。
要するにgetにもsynchronizedは必要。
同期の対象がMap1個で済む状況なら、ConcurrentHashMapは便利。
2個以上のMapを同時に更新しなければならない場合とかには無力。