我试图理解为什么需要调用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()
会给出非确定性行为?如果我错了,请纠正我。