プログラマメモ2 - programmer no memo2

Thread.yieldまた別の使い道 2006/06/28
2006/11/26

Thread.yieldメソッドについての別の使い道についてのコメントをメールでいただきましたので、掲載します。



以前、



「ほとんどのプログラマによるThread.yieldの唯一の使い方は、テスト中にプログラムの平行性を意図的に増加させることです。」

「Effective Java」P.194



と書いたものについてへのコメントとなります。



引用は承諾済みです。



これ以外の理由として、スレッドが TSS で動作していた場合に、次のようなテクニックがあります。



synchronized ブロック内にいるときに TSS の時間切れで他のスレッドに CPU が渡されたとします。



CPU を渡されたスレッドがこの synchronized ブロックを待っていた場合、ブロックされているためせっかく割り当てられた CPU 時間をすべて synchronized ブロック待ちに使うことになります。



この余計な待ちを少なくするために、synchronized ブロックの直前で Thread.yield を呼びます。

次にこのスレッドが処理されるときには、一回で synchronized ブロックを抜けられる可能性が大きくなり、誰かが synchronized ブロック内にいるために起きる余計な synchronized ブロック待ちを避けられます。





重たい排他処理に入る前に Thread.yield を一回実行しておくことで、割り当てられる CPU 時間のスタートを仕切りなおして、できるだけ短いターン(できたら 1 ターンで)で排他処理を通り過ぎよう、というのがその意図というわけです。



2006-06-28 H氏のメールより



ちなみに、TSSはTime Sharing Systemのことですね。

TSSのwikipedia(日本語版)での説明

: