为什么notifyAll()在这个简单的情况下不会恢复其他线程?

db-*_*ser 3 java concurrency multithreading

我是Java并发新手.我有一个简单的对象,有3个方法,每个方法对应3个不同线程运行的代码.为什么在这种情况下notifyAll()语句不释放其他两个线程中的wait?

public class Main {
static class Obj {
      synchronized void t1 () {
          System.out.println("T1 ran");
          try {
              Thread.sleep(1000);
          } catch (InterruptedException e) {
              e.printStackTrace();
          }
          notifyAll();
      }
     synchronized void t2 () {
         try {
             wait();
         } catch (InterruptedException e) {
             e.printStackTrace();
         }
         System.out.println("T2 ran");
     }
    synchronized void t3() {
        try {
            wait();
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        System.out.println("T3 ran");
    }
}

public static void main(String[] args) {
    final Obj o = new Obj();
    new Thread(new Runnable() {
        @Override
        public void run() {
            o.t1();
        }
    }).start();
    new Thread(new Runnable() {
        @Override
        public void run() {
            o.t2();
        }
    }).start();
    new Thread(new Runnable() {
        @Override
        public void run() {
            o.t3();
        }
    }).start();
}}
Run Code Online (Sandbox Code Playgroud)

我预料到:T1跑了~~暂停1秒~~ T2跑了T3跑了

我得到了:T1跑了

tha*_*guy 6

Thread.sleep不会以这种方式释放或放松任何锁定wait,因此同步仍然完全有效,并且在睡眠期间不允许其他线程进入其方法.

如果你更换了

Thread.sleep(1000);
Run Code Online (Sandbox Code Playgroud)

wait(1000);
Run Code Online (Sandbox Code Playgroud)

其他线程将被允许捕获相同的锁,输入方法,开始等待,样本将按预期工作.