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());

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

ジョギング

先月は、体調不良とか、雨が多かったりで、あまり走れなかったのだけど、最近はいつものように走り始めている。だが、あまり走ってなかったせいか、5キロくらい走るのでバテる・・・。また、地道に距離を伸ばせるようにがんばっていこっと。