著作一覧 |
FileOutputStreamがスレッドセーフだなんてどこにも書いてないが、なんとなくスレッドセーフだと思いこんだのが運の尽き。 writeが先なら問題ないし、closeが先ならwriteがクローズ済みの例外になるだろう程度にたかをくくっていると。
j2se1.4.2だと、
FileOutputStream#write →FileLockImpl#release(FileLockImplをロック) →FileChannelImpl.removeList(lockListのロック待ち)と
FileOutputStream#close →FileChannelImpl#implCloseChannel(lockListをロック) →FileLockImpl#invalidate(FileLockImplのロック待ち)
となる(ことがある)。典型的なデッドロックだ。それにつけてもSIGQUIT。
writeはFileOutputStreamでロックをかけるがcloseはかけないのが原因か(でも、この動作はcloseの意味を考えると正しそうだ)。(nioのFileChannelImplの実装はまずいとは思う)
いずれにしろ、書き込みしているスレッドがいる間は、closeを呼ばないようにアプリケーションを修正。
ジェズイットを見習え |