知识大全 Java多线程notify¬ifyall的区别
Posted 知
篇首语:不操千曲而后晓声,观千剑而后识器。本文由小常识网(cha138.com)小编为大家整理,主要介绍了知识大全 Java多线程notify¬ifyall的区别相关的知识,希望对你有一定的参考价值。
Java多线程notify¬ifyall的区别 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!
当一个线程进入wait之后 就必须等其他线程notify/notifyall 使用notifyall 可以唤醒 所有处于wait状态的线程 使其重新进入锁的争夺队列中 而notify只能唤醒一个 注意 任何时候只有一个线程可以获得锁 也就是说只有一个线程可以运行synchronized 中的代码 notifyall只是让处于wait的线程重新拥有锁的争夺权 但是只会有一个获得锁并执行 那么notify和notifyall在效果上又什么实质区别呢? 主要的效果区别是notify用得不好容易导致死锁 例如下面提到的例子 public synchronized void put(Object o) while (buf size()==MAX_SIZE) wait() // called if the buffer is full (try/catch removed for brevity) buf add(o) notify() // called in case there are any getters or putters waiting public synchronized Object get() // Y: this is where C tries to acquire the lock (i e at the beginning of the method) while (buf size()== ) wait() // called if the buffer is empty (try/catch removed for brevity) // X: this is where C tries to re acquire the lock (see below) Object o = buf remove( ) notify() // called if there are any getters or putters waiting return o; 所以除非你非常确定notify没有问题 大部分情况还是是用notifyall cha138/Article/program/Java/gj/201311/27385相关参考