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

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

リモートデバッグ

明日は社内勉強会で、個人的にポータルとポートレットの開発でよく利用する、Eclipseでのリモートデバッグをデモしようと思い、持ち運び用で愛用している LOOX U50 に環境を構築してみる(このマシンでEclipse+Tomcatでデバッグっていうのもどうかと思うけど、とりあえずのデモなので)。そこで、catalina.bat に jpda start でいつものように起動したのだけど、Eclipseからいつものようにはつながらない。何でかと思ったら、.bat と .sh ではJPDA_TRANSPORTとJPDA_ADDRESSのデフォルト値が違うのね・・・。というわけで、

set JPDA_TRANSPORT=dt_socket
set JPDA_ADDRESS=8000

としたら、いつのものようにEclipseから接続できるようになった。めでたし、めでたし。