notify()和notifyAll()都是Object对象用于通知处在等待该对象的线程的方法。两者的最大区别在于:

notifyAll使所有原来在该对象上等待被notify的线程统统退出wait的状态,变成等待该对象上的锁,一旦该对象被解锁,他们就会去竞争。
notify则文明得多他只是选择一个wait状态线程进行通知,并使它获得该对象上的锁,但不惊动其他同样在等待被该对象notify的线程们,当第一个线程运行完毕以后释放对象上的锁此时如果该对象没有再次使用notify语句,则即便该对象已经空闲,其他wait状态等待的线程由于没有得到该对象的通知,继续处在wait状态,直到这个对象发出一个notify或notifyAll,它们等待的是被notify或notifyAll,而不是锁。

下面是一个很好的例子:

import java.util.*;

class Widget...{}
class WidgetMaker extends Thread...{
    List<Widget> finishedWidgets=new ArrayList<Widget>();
    public void run()...{
        try...{
            while(true)...{
                Thread.sleep(5000);//act busy
                Widget w=new Widget();
                //也就是说需要5秒钟才能新产生一个Widget,这决定了一定要用notify而不是notifyAll
                //因为上面两行代码不是同步的,如果用notifyAll则所有线程都企图冲出wait状态
                //第一个线程得到了锁,并取走了Widget(这个过程的时间小于5秒,新的Widget还没有生成)
                //并且解开了锁,然后第二个线程获得锁(因为用了notifyAll其他线程不再等待notify语句
                //,而是等待finishedWidgets上的锁,一旦锁放开了,他们就会竞争运行),运行
                //finishedWidgets.remove(0),但是由于finishedWidgets现在还是空的,
                //于是产生异常
                //***********这就是为什么下面的那一句不能用notifyAll而是要用notify
                                
                synchronized(finishedWidgets)...{
                    finishedWidgets.add(w);
                    finishedWidgets.notify(); //这里只能是notify而不能是notifyAll
                }
            }
        }
        catch(InterruptedException e)...{}
    }
    
    public Widget waitForWidget()...{
        synchronized(finishedWidgets)...{
            if(finishedWidgets.size()==0)...{
                try...{
                    finishedWidgets.wait();
                }
                catch(InterruptedException e)
                ...{}
            }
            return finishedWidgets.remove(0);
        }
    }
}
public class WidgetUser extends Thread...{
    private WidgetMaker maker;
    public WidgetUser(String name,WidgetMaker maker)...{
        super(name);
        this.maker=maker;
    }
    public void run()...{
        Widget w=maker.waitForWidget();
        System.out.println(getName()+"got a widget");
    }

public static void main(String[] args) ...{
        WidgetMaker maker=new WidgetMaker();
        maker.start();
        new WidgetUser("Lenny",maker).start();
        new WidgetUser("Moe",maker).start();
        new WidgetUser("Curly",maker).start();

}

}

本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/SuperMiner/archive/2007/04/22/1574615.aspx

notify和notifyAll区别相关推荐

  1. Java之notify和notifyAll区别

    在Java中notify()和notifyAll()方法都是Object对象用于通知处在等待该对象的线程的方法. 两者的最大区别在于: notifyAll方法 使所有原来在该对象上等待被notify的 ...

  2. wait, notify 和 notifyAll区别

    今天正好碰到这个问题,也疑惑了好久.看了一圈知乎上的答案,感觉没说到根上.所以自己又好好Google了一下,终于找到了让自己信服的解释. 先说两个概念:锁池和等待池 锁池:假设线程A已经拥有了某个对象 ...

  3. notify()和notifyAll()区别

    在同步块中调用了wait()会自动的释放该共享资源的锁,然后从运行状态中退出进入等待队列,直到再次被唤醒. 先来了解notify()的作用 该方法可以随机的唤醒等待队列中等待同一个共享资源的一个线程, ...

  4. notify() 和notifyAll()区别

    引用网上的例子,在明知到生产者 一个生产者,几个抢食者,如果通知所有的抢食者执行的操作会发生异常的时候,使用notify import java.util.ArrayList; import java ...

  5. notify()和 notifyAll()区别

    1.调用notifyAll()会唤醒所有的线程:调用notify()唤醒一个线程. 2.调用notifyAll() 会将全部线程由等待池移到锁池,然后参与锁的竞争,竞争成功则继续执行:如果不成功,则留 ...

  6. 用实例揭示notify()和notifyAll()的本质区别

    用实例揭示notify()和notifyAll()的本质区别 收藏 notify()和notifyAll()都是Object对象用于通知处在等待该对象的线程的方法.两者的最大区别在于: notifyA ...

  7. Java并发编程—notify和notifyAll有什么区别?

    原文作者:知乎用户 原文地址:https://www.zhihu.com/question/37601861/answer/145545371 著作权归作者所有.商业转载请联系作者获得授权,非商业转载 ...

  8. Java-线程中sleep()、wait()和notify()和notifyAll()、suspend和resume()、yield()、join()、interrupt()的用法和区别

    Java线程中sleep().wait()和notify()和notifyAll().suspend和resume().yield().join().interrupt()的用法和区别 从操作系统的角 ...

  9. Java中notify和notifyAll的区别 - 何时以及如何使用

    Java  notify   vs notifyAll notify和notifyAll方法之间有什么区别是棘手的Java问题之一! Condition 是个什么玩意? 提几个问题,从问题中去了解去学 ...

最新文章

  1. SLAM闭合回环————视觉词典BOW小结
  2. 【GStreamer】gstreamer工具详解之:ges-launch-1.0
  3. appium+python自动化测试教程_Python+Appium实现自动化测试
  4. pymongo多结果进行多列排序的代码
  5. Elasticsearch集群部署的相关问题记录
  6. java中break,continue,標籤實現goto效果(編程思想)
  7. sharepoint 场帐号修改密码
  8. 【视频块文件系统不得不说的故事】VBFS文件系统简介
  9. python- 基础 range方法的使用
  10. 【软件架构】三层架构和MVC的比较
  11. 在github网页版里新建文件夹,放置很多子文件:添加斜杠自动生成文件夹
  12. drtek收音机使用说明_美国人拿本国收音机与中国德生PL380做对比,结果怎么样?...
  13. C++中#和##的特殊使用
  14. 「09」真损啊!——损失函数与极大似然估计
  15. 解剖“锋芝恋”,张的婚姻就是谢家处心积虑的一场诈骗?
  16. SONY UP-D898MD 或 UP-X898MD驱动在WIN10 64下的安装
  17. Q7:难道不想手工搞个环境?
  18. Ubuntu18.04 配置nvidia 460驱动、cuda10.1和cudnn7.6.5
  19. 数仓和数据中台长期霸权,数据湖最稳
  20. 浅谈晏殊几何学知识图谱技术

热门文章

  1. jquery ajax封装通用方法
  2. SISO/MIMO信道估计(channel estimation)原理详细图解
  3. 怎么样才能在服务器显示皮肤,服务器怎么使用皮肤
  4. 软件测试'python'版白盒测试三角形问题
  5. Visual Question Answering with Textual Representations for Images 论文笔记
  6. YOLO工程代码如何在windows上配置和运行!window上YOLO训练样本的制作
  7. 阿里云ECS服务器的wordpress博客域名购买、认证、备案、解析以及绑定
  8. Excel怎么把横排变竖排,一键转换表格格式
  9. 【文献阅读2】Cytological and transcriptome analyses reveal abrupt gene expression for meiosis and sacchari
  10. 在C和C ++中创建循环缓冲区