- PR -

排他制御の実行順序について

1
投稿者投稿内容
84
ベテラン
会議室デビュー日: 2005/11/04
投稿数: 83
投稿日時: 2007-10-24 09:33
排他制御の実行順序について
質問があります。

いくつかのスレッドで
排他制御をかけたメソッドを実行すると、
当然ですが同時実行されずに、各スレッドが順番に
メソッドを実行します。

そこで質問なのですが、

1)実行順序は必ずメソッドコールしたスレッドの順番に
なるのでしょうか?
(テストプログラムを作成して実行すると、
コールした順に実行されました。)

2)実行順序が保証されるとすると、
内部的にキューを持っているということでしょうか。

3)またキューが存在するとすると、
キューの最大サイズなども存在するのでしょうか。
mio
ぬし
会議室デビュー日: 2005/08/25
投稿数: 734
お住まい・勤務地: 神奈川県
投稿日時: 2007-10-24 10:21
synchronizedのことだとすると…。
synchronizedをどのタイミングでかけるのかによりますが、そこへたどり着く前の処理をどれくらい速く終えられるかによるので、後からメソッドを呼んだほうが先になることもありえるのでは。

[ メッセージ編集済み 編集者: mio 編集日時 2007-10-24 10:21 ]
かつのり
ぬし
会議室デビュー日: 2004/03/18
投稿数: 2015
お住まい・勤務地: 札幌
投稿日時: 2007-10-24 10:53
ウェイトセット内にいる複数スレッドが、
ウェイトセットを抜けて再度モニタを取得するときの優先順位については、
特に規定されていなかったと思いました。

なので、たまたまウェイトセットに入った順に、
たまたまモニタが取得されているだけという感じでは?
無理やりバラバラにするような実装を行うメリットもないと思います。
あしゅ
ぬし
会議室デビュー日: 2005/08/05
投稿数: 613
投稿日時: 2007-10-24 12:56
引用:

84さんの書き込み (2007-10-24 09:33) より:
1)実行順序は必ずメソッドコールしたスレッドの順番に
なるのでしょうか?
(テストプログラムを作成して実行すると、
コールした順に実行されました。)


synchronizedでは順序は一切規定されていません。
順序を規定したいなら自分でそのように作る必要があります。

CPUが一つだとスレッドは直列的に動作するため
表面的に予想した順序になりがちです。
最低二つ以上のCPUから負荷をかけましょう。

引用:

2)実行順序が保証されるとすると、
内部的にキューを持っているということでしょうか。


この辺りはjava.util.concurrent.locks.ReentrantLockの
公平性について調べるとよいと思います。

内部に待機キューは持っていますが、
NonfairSyncではロック獲得時に獲得可能であれば
待機キューを無視するので必ず使われる保証もないです。

synchronizedは常にfairではないです。
ReentrantLockのように公平性の選択は出来ません。

引用:

3)またキューが存在するとすると、
キューの最大サイズなども存在するのでしょうか。


限界を超えたらOutOfMemoryErrorが飛んでくるかと。
84
ベテラン
会議室デビュー日: 2005/11/04
投稿数: 83
投稿日時: 2007-10-24 16:39
みなさん、
回答ありがとうございます。

とても詳しいご説明をいただいて、
参考になりました。
1

スキルアップ/キャリアアップ(JOB@IT)