ネタ心者歓迎!今更ながらにJava相談室 その2
■ このスレッドは過去ログ倉庫に格納されています
0383デフォルトの名無しさん
NGNGオブジェクトインスタンスは、内部にモニターという
ロックを管理するデータを、必ず一個もっています。
synchronized(obj)というステートメントで、その
ステートメントに入ったスレッドが、objのモニター
を獲得します。このとき、objのモニターをどこか他の
スレッドが獲得していた場合は、そのモニターが解放
されるのを待ちます。
一度獲得したモニターは、以下のいずれかで解放されます。
1.synchronized(obj){}のスコープ外に出たとき。
2.obj.wait()をコールした時。(この場合、他のスレッド
から起こされるなどで再びここに戻ってくると、またobj
のロックを獲得する事になります。)
2.によりobjのモニター解放されるので、別のスレッドが
synchronized(obj){obj.notify();}のスコープ内に、
objのモニターを獲得して入ることができます。
ここでnotify()メソッドは、obj.wait()でwait状態
になっているスレッドの一つを、runnable状態に変更
します。(スレッドは、wait(待機状態)、runnable
(実行可能、スケジューリング待ち状態)、running
(CPUリソース使用中)のいずれかの状態を持っています。
VMのスレッドスケジューラや、wait(),sleep()メソッド
などがこのスレッドの状態を変更します。)
あとは、VMのスレッドスケジューラがいつかはrunnable
になっているスレッドを実行してくれるので、wait()で
寝ていたスレッドが、そのタイミングでまた動き出すわけ
です。(wait状態のスレッドは、VMのスケジューラの
スケジューリング対象外になるので、notifyしなければ
スレッドはいつまでも寝ています。)
こんな感じでよろしいですか?
■ このスレッドは過去ログ倉庫に格納されています