- - PR -
排他制御の実行順序について
1
投稿者 | 投稿内容 | ||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|
|
投稿日時: 2007-10-24 09:33
排他制御の実行順序について
質問があります。 いくつかのスレッドで 排他制御をかけたメソッドを実行すると、 当然ですが同時実行されずに、各スレッドが順番に メソッドを実行します。 そこで質問なのですが、 1)実行順序は必ずメソッドコールしたスレッドの順番に なるのでしょうか? (テストプログラムを作成して実行すると、 コールした順に実行されました。) 2)実行順序が保証されるとすると、 内部的にキューを持っているということでしょうか。 3)またキューが存在するとすると、 キューの最大サイズなども存在するのでしょうか。 | ||||||||||||
|
投稿日時: 2007-10-24 10:21
synchronizedのことだとすると…。
synchronizedをどのタイミングでかけるのかによりますが、そこへたどり着く前の処理をどれくらい速く終えられるかによるので、後からメソッドを呼んだほうが先になることもありえるのでは。 [ メッセージ編集済み 編集者: mio 編集日時 2007-10-24 10:21 ] | ||||||||||||
|
投稿日時: 2007-10-24 10:53
ウェイトセット内にいる複数スレッドが、
ウェイトセットを抜けて再度モニタを取得するときの優先順位については、 特に規定されていなかったと思いました。 なので、たまたまウェイトセットに入った順に、 たまたまモニタが取得されているだけという感じでは? 無理やりバラバラにするような実装を行うメリットもないと思います。 | ||||||||||||
|
投稿日時: 2007-10-24 12:56
synchronizedでは順序は一切規定されていません。 順序を規定したいなら自分でそのように作る必要があります。 CPUが一つだとスレッドは直列的に動作するため 表面的に予想した順序になりがちです。 最低二つ以上のCPUから負荷をかけましょう。
この辺りはjava.util.concurrent.locks.ReentrantLockの 公平性について調べるとよいと思います。 内部に待機キューは持っていますが、 NonfairSyncではロック獲得時に獲得可能であれば 待機キューを無視するので必ず使われる保証もないです。 synchronizedは常にfairではないです。 ReentrantLockのように公平性の選択は出来ません。
限界を超えたらOutOfMemoryErrorが飛んでくるかと。 | ||||||||||||
|
投稿日時: 2007-10-24 16:39
みなさん、
回答ありがとうございます。 とても詳しいご説明をいただいて、 参考になりました。 |
1