マルチスレッドは難しい

フィールドの変数でリソースの解放が必要なものがあったので
finalizeメソッドで解放し忘れているときは解放するように書いておいたん


マルチスレッドの時に同一の変数にアクセスされるとそれはそれは困ったことに
なることに気がついたので
ThreadLocalな変数にしたところ
finalizeの際にリソースが解放されていないことが発覚した


finalizeはgcさん任せなのでどうやら別スレッドから呼び出されているようだ


困ったことになったので大幅な変更を余儀なくされた
1.少々回りくどいが、リソースを保持クラス(これをAとする)を保持するクラス(これをBとする)を作成
2.BにはThreadLocalでAを持たせる
3.Aには普通に変数を持たせる
4.Aのfinalizeメソッドでリソースが解放されていない場合は解放する
5.AとBを同一パッケージに入れて,Aにはデフォルトのアクセス修飾子にしてB以外からアクセスできなくする


これで、少なくともスレッド終了後にはリソースが解放される可能性を持つことになる
いつになるかはわからないがもともとfinalize自体がそんなもんなのでまあ、大丈夫だろう
とりあえず意図的に開放しなかった場合にちゃんとFinalizerさんがログをはいてるのは確認できたし

それにしても使う側からは特別な操作が一切必要なくAOP的なことやってくれればこの手のことは問題にならないのになぁ…

そういや昔、C++でnewとdeleteは勝手にやってくれるってプログラム書いたな…
でもあれはdeleteのタイミングをこっちで制御できるからうまく動くだよなぁ…
そもそも今回のリソースの解放と違って明確にdeleteするべきタイミングが分かってる前提だし…


あ、でもデストラクタ呼び出されるタイミングはわかってるからそっち使う側でよろしくやればうまくいくかも(え?オブジェクト指向チックじゃないって?知るか!!)


というわけで今日の結論
GC嫌い、信用できない。でも、プログラマは人間なのでもっと信用できない