Discuss / Java / 对notifyAll()的理解

对notifyAll()的理解

Topic source

1

#1 Created at ... [Delete] [Delete and Lock User]

谈谈我个人对notifyAll()的理解,更好的解释while和if的问题。当生产者调用notifyAll()之后,唤醒所有处于waiting状态的消费者。所有消费者竞争后其中一个获得锁进入runnable状态执行,而没有获得锁的消费者则进入blocking状态等待锁释放,并不会执行wait()之后的语句。当之前获取到锁的消费者执行完毕后,处于blocking状态的消费者竞争后其中一个获取锁,执行wait()之后的语句。所以关键在于,从wait()返回并执行后面语句的条件不一定是被notiyAll()唤醒之后第一个抢到锁的消费者,有可能是唤醒之后抢不到锁处于blocking状态后又拿到锁的消费者,这就有可能出现queue为空的情况。所以这里面waiting和blocking的状态还是很关键的。这里面为了简化,没有出现有其他新的生产者addTask()的情况。欢迎探讨我的想法,多多指教。

Red

#2 Created at ... [Delete] [Delete and Lock User]

有点明白

细水静流

#3 Created at ... [Delete] [Delete and Lock User]

是不是可以理解为三个状态?等待、阻塞、运行。wait其实就是主动让所有线程等待,知道生产池中有了可取的东西,而blocking其实就是唤醒后,都不等待了,但是只能有一个拿到锁,其余被动的进入阻塞状态,直到一个进程释放了锁。所以这其实是分开的,等待是因为生产池中没有东西,你得等我生产,因此条件是看生产者。而阻塞是多线程中只能有一个拿到锁的情况。

Caprice

#4 Created at ... [Delete] [Delete and Lock User]

用if判断,用notify唤醒一个线程效果是一样的呀,为什么非要用notifyall呢?用notifyall也可能出现某些线程被唤醒后一直获取不到锁的情况。


  • 1

Reply