Collections.synchronized~

Collections.synchronizedMap(Map)すると何が起きるのか気になったのでコードを見てみると、インナークラスのSynchronizedMapでラップしている。そのクラスでは、メンバーに受け取ったMapとObject(mutexっていう名前で)を持っている。mutexにはnewするときに自分自身(SynchronizedMapのthis)を渡して、各メソッドの中でsynchronized(mutex)してロック対象にしている。そんで、keySet()とか呼ばれたときには、Synchronized~でラップして、オブジェクトを返す。なるほど、そういうことになっているのね。というわけで、

Map cache = Collections.synchronizedMap(new HashMap());
Collection values = Collections.synchronizedCollection(cache.values());

というようなコードは無駄ですね。

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です