java通知和notifyAll的对比

  

<强>,java通知和notifyAll

  

首先从名字可以了解,通知是通知一个线程获取锁,notifyAll是通知所有相关的线程去竞争锁。

  

通知不能保证获得锁的线程,真正需要锁,并且可能产生。

  

<强>举例1:

  

所有人(消费者线程)准备吃饭,食堂没有开放(没有释放锁)打饭窗口(锁),所有人等待(等待)。

  

食堂开饭打饭窗口(释放锁),并广播消息”开饭了”(notifyAll),所有人竞争排队,并等待吃饭(阻塞)。每一个人依次在打饭窗口(获得锁)打饭(RUNNABLE)。如果想吃饭就打完饭后离开(释放锁),不想吃饭就直接离开(释放锁)。如果吃完了还想吃,就主动等待下一次“开饭了”的消息(等待)。

  

食堂通知一个人来吃饭(通知),此人来到打饭窗口(获得锁)打饭(可运行),其他人都在等待开饭的消息(等待)。如果想吃饭就打完饭后离开(释放锁),不想吃饭就直接离开(释放锁)。如果吃完了还想吃,就主动等待下一次“开饭”的消息(等待)。
  通知不能保证通知到真正想吃饭的人。

  

<强>举例2:

  

两个生产者P1, P2,两个消费者C1, C2,共同操作一个队列,队列最大长度为1 .

  

开始P1, P2, C1, C2都处于运行状态(RUNNABLE)。

  

C1先获得锁,P1, P2, C2为阻塞状态.C1发现队列为空,主动进入WAITING.C2接着获得锁,成为RUNNABLE状态,发现队列为空,主动进入等待。

  

P1接着获得锁,成为RUNNABLE状态,在队列中插入一个元素,通知到了另一个生产者P2.P1循环生产,发现队列不为空,成为等待。

  

P2成为RUNNABLE状态,发现队列有值,主动进入等待。

  

此时锁已被释放,但P1, P2, C1, C2都处于等待状态,没有线程去获取锁、死了。

  

感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!

java通知和notifyAll的对比