对notifyAll()的理解
Topic source是不是可以理解为三个状态?等待、阻塞、运行。wait其实就是主动让所有线程等待,知道生产池中有了可取的东西,而blocking其实就是唤醒后,都不等待了,但是只能有一个拿到锁,其余被动的进入阻塞状态,直到一个进程释放了锁。所以这其实是分开的,等待是因为生产池中没有东西,你得等我生产,因此条件是看生产者。而阻塞是多线程中只能有一个拿到锁的情况。
- 1
是不是可以理解为三个状态?等待、阻塞、运行。wait其实就是主动让所有线程等待,知道生产池中有了可取的东西,而blocking其实就是唤醒后,都不等待了,但是只能有一个拿到锁,其余被动的进入阻塞状态,直到一个进程释放了锁。所以这其实是分开的,等待是因为生产池中没有东西,你得等我生产,因此条件是看生产者。而阻塞是多线程中只能有一个拿到锁的情况。
1
谈谈我个人对notifyAll()的理解,更好的解释while和if的问题。当生产者调用notifyAll()之后,唤醒所有处于waiting状态的消费者。所有消费者竞争后其中一个获得锁进入runnable状态执行,而没有获得锁的消费者则进入blocking状态等待锁释放,并不会执行wait()之后的语句。当之前获取到锁的消费者执行完毕后,处于blocking状态的消费者竞争后其中一个获取锁,执行wait()之后的语句。所以关键在于,从wait()返回并执行后面语句的条件不一定是被notiyAll()唤醒之后第一个抢到锁的消费者,有可能是唤醒之后抢不到锁处于blocking状态后又拿到锁的消费者,这就有可能出现queue为空的情况。所以这里面waiting和blocking的状态还是很关键的。这里面为了简化,没有出现有其他新的生产者addTask()的情况。欢迎探讨我的想法,多多指教。