synchronized()
この投稿の最後に書いたプログラムのブロックを理解しようとしています。
共有オブジェクトを待機/通知のモニターとして使用する2 つのスレッド (o
および) があります。k
lock
o
k
次の同期ブロック内で、開始を待機します。
synchronized (lock) {
lock.wait(); // wait for K to be ready
}
k
次に、通知o
して、このブロック内で印刷されるのを待ちます。
synchronized (lock) {
lock.notify(); // tell O to print
lock.wait(); // wait for O to print
}
私の質問は、どのようk
にして同期ブロックに入ることができますlock
か? o
所有すべきではないlock
(と呼ばれているためwait()
)? Javaチュートリアルには次のように書かれています:
スレッドが固有ロックを所有している限り、他のスレッドが同じロックを取得することはできません。他のスレッドは、ロックを取得しようとするとブロックされます。
完全なプログラムは次のとおりです。
public class OK implements Runnable {
private static final Object lock = new Object(); // monitor for wait/notify
private boolean isO;
public OK(boolean b) {
isO = b;
}
public static void main(String[] args) throws InterruptedException {
Thread o = new Thread(new OK(true));
Thread k = new Thread(new OK(false));
o.start();
k.start();
k.join(); // when k is done, we're done
System.out.println("Done.");
}
public void run() {
// run method is called for both o and k, so we separate the logic
try {
if (isO) {
doO();
} else {
doK();
}
} catch (InterruptedException e) {
e.printStackTrace();
}
}
// O thread logic
private void doO() throws InterruptedException {
// K needs to be ready before I start
synchronized (lock) {
lock.wait(); // wait for K to be ready
}
System.out.print("O");
synchronized (lock) {
lock.notify(); // tell K I printed
}
}
// K thread logic
private void doK() throws InterruptedException {
// O is waiting for me to start
synchronized (lock) {
lock.notify(); // tell O to print
lock.wait(); // wait for O to print
}
System.out.println("K");
}
}