Mapの同期化・・・

ちょっとそんな話題が出て、勘違いしている人が多いというか、多そうなので。


詳しくは以下を参考に。
http://q.hatena.ne.jp/1151997995
http://www.ibm.com/developerworks/jp/java/library/j-jtp07233/
http://www.ibm.com/developerworks/jp/java/library/j-jtp08223/


結局の所、スレッドセーフと、
Iterator(とか)取得後のCollectionの更新による例外とか(のDBのトランザクション的な問題とか)
の話は無関係で、必要であれば、そのCollectionに対する同期化は必要である。
ということ。
取得してから、処理するまでのブロックをちゃんと同期化しなよ〜と。
(まぁConcurrentHashMap?は例外は発生しないけど)



まぁうまく伝えられた自信はないけど
ちなみにリンク先にあった以下は名言
というか結局はこれがいいたい。

信頼に関する誤った意識

synchronizedListとsynchronizedMapが提供している条件付きスレッド・セーフには、
隠された危険性があります。
開発者はこれらのコレクションは同期化しており、完全にスレッド・セーフであると考え、
複合的なオペレーションを適切に同期化させることを怠たるようになるのです。
その結果、これらのプログラムは簡単に機能しているように見えて、
実際は高い負荷により、NullPointerExceptionやConcurrentModificationExceptionを投げることになるかもしれないのです。