同期オブジェクトのロックが解除されるまで待つことは想定されていませんか?
ロックはthreaddoSomething
によって保持されるため、2 回 ( in への最初の呼び出しの場合) 同期しているという事実main
は問題ではなく、同じスレッド上にあります。その後、別のsynchronized
スレッドが でブロックに入ろうとするとobjToSync
、そのスレッドは、このスレッドがすべてのロックを解放するまで待機します。
あなたのコードはこれを行います:
- 入る
main
objToSync
オブジェクトの現在のスレッドのロックを取得します
- 「何か」を出力する
- 電話
doSomething
- 現在のスレッドの 2 番目のロックを取得する
objToSync
- 出力「何か 2」
- 現在のスレッドの 2 番目のロックを解放します。
objToSync
- から戻る
doSomething
- 「something three」を出力する
- 現在のスレッドの最初のロックを解放します
objToSync
- 電話
doSomething
- で新しいロックを (同じスレッドに対して) 取得します。
objToSync
- 出力「何か 2」
- そのロックを解除
- から戻る
doSomething
- から戻る
main
2 つのスレッドを使用した例を次に示します。
public class SyncExample {
private static Object objToSync = new Object();
public static final void main(String[] args) {
Thread second;
System.out.println("Main thread acquiring lock");
synchronized (objToSync) {
System.out.println("Main thread has lock, spawning second thread");
second = new Thread(new MyRunnable());
second.start();
System.out.println("Main thread has started second thread, sleeping a moment");
try {
Thread.currentThread().sleep(250);
}
catch (Exception e) {
}
System.out.println("Main thread releasing lock");
}
System.out.println("Main thread sleeping again");
try {
Thread.currentThread().sleep(250);
}
catch (Exception e) {
}
System.out.println("Main thread waiting for second thread to complete");
try {
second.join();
}
catch (Exception e) {
}
System.out.println("Main thread exiting");
}
static class MyRunnable implements Runnable {
public void run() {
System.out.println("Second thread running, acquiring lock");
synchronized (objToSync) {
System.out.println("Second thread has lock, sleeping a moment");
try {
Thread.currentThread().sleep(250);
}
catch (Exception e) {
}
System.out.println("Second thread releasing lock");
}
System.out.println("Second thread is done");
}
}
}
出力:
ロックを取得するメインスレッド
メイン スレッドにロックがあり、2 番目のスレッドが生成されます
メイン スレッドが 2 番目のスレッドを開始しました。しばらくスリープ状態です
2 番目のスレッドが実行中、ロックを取得中
主糸ゆるめロック
メインスレッドが再びスリープ状態に
2 番目のスレッドがロックされています。しばらくスリープ状態です
2 番目のスレッドの完了を待機しているメイン スレッド
二番糸緩めロック
2番目のスレッドが完了しました
メインスレッドの終了