[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[jfriends] Re: JDK1.2でのThread.stopを調べていて




In article <199903051752.CAA02612@xxxxxxxxxx>
Toru Takahashi wrote:
>
>>あのサンプルコードは、blinkerに一度しかThreadオブジェクトしか入らな
>>いという前提で書かれているわけではないために
>>>  while(blinker == thisThread) {
>>こうなっているのではないでしょうか.
>
>>例えばstop()メソッドでblinker = null;が実行されて、run()側のwhile文
>>を抜ける前に別の個所でblinkerに新たなThreadが設定されて、再実行が行
>>われるかもしれません.
>なるほど、このケースは考えてませんでした。短い時間内にstop(), start()
>が呼ばれる場合にあり得ますね。
>run()メソッドをsynchronizeにする手もあるかとおもったのですが、
>sleep()しているときは、だめですね

sleep()はwait()と異なり、ブロックしている間もそのオブジェクトのロック
を持ったままですので、たとえばrun()とblinkerにnull以外を代入するメソッ
ド(仮にstart())をsynchronizedにしておけば、runが終了しない限りblinker
にnull以外(新たなThread)を代入できなくなりますね.
# wait()だとstart()が呼べてしまいますが.

sleepを含むメソッドをsynchronizedにするのは注意が必要です.
これだとstopを呼ばずに(synchronizedな)startを呼び出してしまうと、誰か
がstopするまでブロックされてしまいます.
# その誰かがいなければデッドロックです.

ThreadSafeなままでクリティカルセクションを減らそうとした結果なんでしょ
うね.

--
木下 信@イデア