日期:2014-05-20  浏览次数:20760 次

Java面试问题之四十六
请问在Java中notify()和notifyAll方法有什么区别?

答:Java中notify()和notifyAll()方法的主要区别在于:notifyAll()方法会使原来在某个对象等待池中的线程全部退出wait状态,进入该对象的锁池中,一旦该对象的锁被释放,它们会竞争获取对象的锁。相比之下,notify()方法只会随机选择一个处于wait状态的线程进行唤醒,使这个线程进入该对象的锁池中,当对象的锁被释放后并且该线程获得了CPU运行时间后即被执行,其他线程则保持原来的状态(还处于该对象的等待池中)。

注意:如果一个线程运行完毕后释放对象上的锁,并且没有使用notify()语句,即使该对象已经空闲了,在该对象等待池中的线程由于没有得到通知而保持原来wait状态。处于等待池中的线程等待的是被notify或者notifyAll,还没有到竞争对象锁的阶段。