FileChannel#lock()は同一VMの複数スレッドでは使えない

ファイルシステムを扱うプログラミングは久しぶり。
で、今までnioをあんまり触ってこなかったのだけど、ロックかけたり触る機会があったので触ったら案の定ハマったのでした。

ファイルロックは Java 仮想マシン全体のために保持されます。これらは、同一仮想マシン内の複数スレッドによるファイルへのアクセスを制御するのには適していません。
ファイルロックオブジェクトは、複数の並行スレッドで安全に使用できます。

http://java.sun.com/j2se/1.5.0/ja/docs/ja/api/java/nio/channels/FileLock.html

要するに、あくまでJava外からファイルを操作された場合を想定しているんであって、同じVMで動いているjavaプログラムはファイルを操作出来ちゃう。
あと、既にロックかかっているファイルをロックかけようとすると java.nio.channels.OverlappingFileLockException が発生。

んー、まぁ理解は出来る挙動だけど、そうなると例えばダウンロードスレッドを複数本立ててファイルダウンロードなんてのは、ファイルパスとロックオブジェクトを管理するstaticなマップオブジェクトでも作って……と今までと変わらない実装しか無いわけか。うーん。