为什么Java中需要notify()?

时间:2017-06-29 18:08:08

标签: java multithreading

我试图理解为什么需要调用notify()方法来恢复wait()的原因。让我们从生产者消费者问题中获取以下伪代码样本 - :

制作人伪代码

synchronized(data_structure) {
if(data_structure.isFull()) {
  data_structure.wait();
  }
produce(data_structure);
notify(); // The consumer thread is only notified, it cannot start execution since it does not have a lock.
    }// Only when the producer gives up the lock can the consumer start.

消费者伪代码

synchronized(data_structure) {
    if(data_structure.isEmpty()) {
      data_structure.wait();
      }
consume(data_structure);
notify(); // The Producer thread does not resume execution from this point, its just notified it can.

}//The producer thread only resumes execution when the consumer thread releases the lock. So what was the point of notify() ?

所以我的观点是notify()只通知等待的线程,在调用notify()的线程释放该对象的锁之前,实际上什么也没发生。因此,如果等待的线程只是等待并且没有调用notify(),则释放锁并且等待的线程继续执行,会对其造成什么伤害?

我知道notify()需要处于同步块中,因为要避免竞争条件,但为什么要先调用,如果在释放锁之前没有任何反应?

就像我有一部我正在使用的手机而另一个人正在等待手机,他唯一的工作是等待手机。因此,当我完成工作并放弃对手机的控制权他显然会知道它现在可用为什么我需要告诉他可用,然后放弃控制?

顺便说一句,据我所知,如果有多个线程在等待,notifyAll()会给出非确定性行为?如果我错了,请纠正我。

0 个答案:

没有答案