多线程同步控制

69 阅读1分钟

wait和notify方法

  • wait、notify、notifyAll都是Object的方法
  • wait、notify、notifyAll都需要先获得对象锁,即在synchronized之中
  • wait阻塞当前线程,并释放锁
  • notify随机唤醒一个因调用该对象锁的wait方法而阻塞的线程,使其重新去竞争锁,执行完notify并不会释放锁,仍然是synchronized方法执行完后释放锁
  • notifyAll唤醒所有因调用该对象锁的wait方法而阻塞的线程
Object o = new Object();
new Thread(()->{
    synchronized (o){
        System.out.println("1s");
        try {
            o.wait();
        } catch (InterruptedException e) {
            throw new RuntimeException(e);
        }
        System.out.println("1e");
    }
}).start();
Thread.sleep(1000);
new Thread(()->{
    synchronized (o){
        System.out.println("2s");
        o.notify();
        System.out.println("2e");
    }
}).start();
1s
2s
2e
1e

join方法