2 - 4 : スレッドロック・再開

スロッドのロック・再開に関するメモ。

スレッドがオブジェクトについてwait()を呼び出すには、
そのオブジェクトのロックを所有していなければならない。
所有していない場合は例外がthrowされる。

Thread.sleep は static メソッドなので、

class MyThread extends Thread {
public void run() {}
}
Thread t1 = new MyThread();
t1.run();
t1.sleep(); // A

と記述した場合、スレッド t1 がsleepするような印象を受けるが、
実は全くそのようなことはなく、Thread.sleep() と全く同じである。

wait() により待機状態にあるスレッド(A)が別スレッド(B)の notify により
ロック探索状態になる。
このときはまだ別スレッド(B)がロックを取得したままなので
スレッド(A)がすぐにロックを取得できるということはない。

時間→
スレッド(A) wait(); ロック探索 ロック取得
↓ ↑ ↑
スレッド(B) ロック取得 notify() ロック解放