wait() 与 notify/notifyAll() 是Object类的方法
1. wait() 与notify/notifyAll方法必须在同步代码块中使用
在执行以上方法时,要先获得锁。那么怎么获得锁呢?
使用synchronized关键字获得锁。因此,wait() 与 notify/notifyAll() 经常与synchronized搭配使用,
即在synchronized修饰的同步代码块或方法里面调用wait() 与 notify/notifyAll()方法。
2. wait() 与 notify/notifyAll() 的执行过程
前提:锁只有一把,只是一个对象
当线程执行lock.wait()时,会把当前的锁释放,然后让出CPU,进入等待状态。
当执行notify/notifyAll方法时,会唤醒一个/所有处于等待该对象锁的线程
package cn.bit13.libra.testWaitNotify; public class ThreadA extends Thread{ private Object lock; public ThreadA(Object lock){ super(); this.lock= lock; } @Override public void run(){ synchronized (lock){ try { System.out.println("A放弃锁"); lock.wait(); }catch(InterruptedException e){ } System.out.println("A重获锁"); } } }
package cn.bit13.libra.testWaitNotify; public class ThreadB extends Thread{ private Object lock; public ThreadB(Object lock){ super(); this.lock= lock; } @Override public void run(){ synchronized (lock){ System.out.println("B通知A可以重获锁(但必须等B执行完)"); lock.notify(); System.out.println("B运行完"); } } }
package cn.bit13.libra.testWaitNotify; public class TestWaitNotify { public static void main(String[] args){ Object lock= new Object(); //锁即一个对象 Thread a= new ThreadA(lock); a.start(); Thread b= new ThreadB(lock); b.start(); } }
输出:
A放弃锁
B通知A可以重获锁(但必须等B执行完)
B运行完
A重获锁
3. notify()通知第一个wait的进程,notifyAll()通知所有wait的进程