• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:スレッドの状態遷移について。。。)

スレッドの状態遷移について - synchronizedの部分について

このQ&Aのポイント
  • Javaの本において、スレッドの状態遷移について説明があります。
  • 特に、Synchronized指定されたメソッド(同期メソッド)の部分に注目しました。
  • 質問者は、スレッドがsleep()メソッドで『実行不可能状態』になった場合、他のスレッドも『実行不可能状態』へ移行するのかについて質問しています。

質問者が選んだベストアンサー

  • ベストアンサー
  • tyatsumi
  • ベストアンサー率58% (30/51)
回答No.3

添付失敗してしもうた。。

その他の回答 (2)

  • tyatsumi
  • ベストアンサー率58% (30/51)
回答No.2

Wikipediaから図を持ってきて添付してみました。 Blocked: 実行不可能状態(ブロック、スリープ) Waiting: 実行可能状態(待機状態) Running: 実行中 と対応していると思います。 t1がm1の中でsleepが実行されると、 スレッドは実行を停止ます。 これが「実行不可能状態」に対応しているはずです。 sleepは指定時間の間何もしない(実行を停止)で、 指定時間が過ぎると実行を再開します。 この段階で「実行可能状態」に移り、「実行中」に移ります。 t1はまだm1の中なのでここまではロックを保持しているので、 他のスレッドt2などはまだm1に入れません。 この段階でt2がm1に入ろうとすればt2は実行不可能状態になります。 t1がm1を終了するとロックを外すので、 t2がm1に入れるようになります。 t2がm1の入口で待っていた(実行不可能状態)とすると、 このときt2は実行可能状態に移り、実行中に移ればm1に入ります。

参考URL:
http://ja.wikipedia.org/wiki/%E3%83%97%E3%83%AD%E3%82%BB%E3%82%B9
  • tyatsumi
  • ベストアンサー率58% (30/51)
回答No.1

簡単に言うと、synchronized宣言されたメソッドは、同時にひとつのスレッドでしか実行されません。 synchronized宣言されたメソッドm1があるスレッドt1で実行されている最中は、 他のスレッドt2はそのメソッドm1を実行しようとすると入ることができず待たされます。 t1がm1を終えるとt2は待ちを解除されm1に入ることができます。 ところがt1がm1を実行中にsleepしてしまうと、 sleepが終わるまでt1はm1を終了しないので、 m1に入ろうとしていたスレッドt2はずっと待たされます。 t1がsleepを終えてm1を抜けるまで待たされることになります。 という意味のはずです。 なお、スレッドt2はm1を実行しようとしたら待たされるのであって、 他の関係ない処理は継続して実行できます。 なのでt1が止まってしまったからt2も無条件に止まるということはありません。 ちなみに、ひとつのクラスC(のインスタンスi)内の2つのメソッドm1, m2がどちらもsynchronized宣言されていると、 あるスレッドt1がm1を実行中のとき、別なスレッドt2はm1に入れないだけでなく、m2にも入れません。 これはm1, m2はどちらも共通のオブジェクトiで排他処理(ロック)されているからです。 一方でスレッドt2はsynchronized宣言されていないC(i)内のメソッドm3には自由に入れます。 何のオブジェクトに関しても排他処理されていないからです。

yukiyayako
質問者

お礼

ご丁寧な文面、付随事項、解りやすい解説をありがとうございます。 ちょっと確認の意味もこめての質問させてください。 >ところがt1がm1を実行中にsleepしてしまうと、 >sleepが終わるまでt1はm1を終了しないので、・・・ そもそもsleepは『実行不可能状態』にいるわけですよね? という事は、t1がsleepを終了すると、『実行中』には戻れないから、 ロックだけを開放して『実行不可能状態』に待機しているという事ですか? で、t2かt3のどちらかがsynchronizedスレッドに入っていく、 という事でいいのでしょうか? つまり、t2もt3も『実行可能状態』に居続ける、という事でいいのでしょうか。 何度もすみません、宜しくお願い致します。

関連するQ&A