notify是object方法吗_wait方法和notify方法

notify是object方法吗_wait方法和notify方法区别notify:只会唤醒等待该锁的其中一个线程。notifyAll:唤醒等待该锁的所有线程。既然notify会唤醒一个线程,并获取锁,notifyAll会唤醒所有线程并根据算法选取其中一个线程获取锁,那最终结果不都是只有一个线程获取锁吗?那JDK为什么还需要做出来这两个方法呢?这两种同步方法本质上会有什么区别?这还要从对象内部锁的调度说起。对象内部锁其实,每个对象都拥有两个池,分…

大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。

Jetbrains全系列IDE使用 1年只要46元 售后保障 童叟无欺

区别

  • notify:只会唤醒等待该锁的其中一个线程。
  • notifyAll:唤醒等待该锁的所有线程。

既然notify会唤醒一个线程,并获取锁,notifyAll会唤醒所有线程并根据算法选取其中一个线程获取锁,那最终结果不都是只有一个线程获取锁吗?那JDK为什么还需要做出来这两个方法呢?这两种同步方法本质上会有什么区别?

这还要从对象内部锁的调度说起。

对象内部锁

其实,每个对象都拥有两个池,分别为锁池(EntrySet)和(WaitSet)等待池。

  • 锁池:假如已经有线程A获取到了锁,这时候又有线程B需要获取这把锁(比如需要调用synchronized修饰的方法或者需要执行synchronized修饰的代码块),由于该锁已经被占用,所以线程B只能等待这把锁,这时候线程B将会进入这把锁的锁池。
  • 等待池:假设线程A获取到锁之后,由于一些条件的不满足(例如生产者消费者模式中生产者获取到锁,然后判断队列为满),此时需要调用对象锁的wait方法,那么线程A将放弃这把锁,并进入这把锁的等待池。

如果有其他线程调用了锁的notify方法,则会根据一定的算法从等待池中选取一个线程,将此线程放入锁池。
如果有其他线程调用了锁的notifyAll方法,则会将等待池中所有线程全部放入锁池,并争抢锁。

锁池与等待池的区别:等待池中的线程不能获取锁,而是需要被唤醒进入锁池,才有获取到锁的机会。

问题复现

那么使用notify和notifyAll到底会有什么区别呢?
请看下面一组生产者消费者的例子。
有两个生产者t1和t2,两个消费者t3和t4,以及一个长度为1的队列。

  1. 初始状态,这四个线程全部进入锁池,等待抢占锁。
  2. t3获取到锁,但是队列为空,故t3进入等待池。
  3. t4获取到锁,但是队列为空,故t4进入等待池。
  4. t1获取到锁,生产,队列满,调用notify,唤醒一个线程。由于此时t3和t4都在等待池中,所以会有一个线程从等待池进入锁池,假设此处t3进入锁池。
  5. 此时,锁池有t2和t3两个线程,假设t2获取到了锁,但是队列满,故t2进入等待池,放弃锁。
  6. 此时,t3获取到锁,消费,notify,由于此时等待池有两个线程t2和t4,假如唤醒的是t2,没问题开始生产,但是若唤醒的是t4,则因队列为空,继续wait。
  7. 此时若t1和t3已经执行结束,t1不在生产,t3不再消费,则t2和t4会一直留在锁池,行程死锁。

如果此处使用notifyAll,则会把等待池中所有线程唤醒,不会形成所有线程都位于等待池,无法唤醒的情况,也就不会形成死锁,当然了,使用notifyAll方法会更加低效一些。

如果此处是一个生产者一个消费者的情况,使用notify没有任何问题,且效率更高。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/196132.html原文链接:https://javaforall.net

(0)
上一篇 2025年10月2日 下午11:01
下一篇 2025年10月2日 下午11:43


相关推荐

  • Python爬虫超详细讲解(零基础入门,老年人都看的懂)

    Python爬虫超详细讲解(零基础入门,老年人都看的懂)关于Python爬虫的超详细讲解,用例子来给大家一步步分析爬虫的代码原理,由浅入深,老年人来了,我也给你整明白。

    2022年6月14日
    42
  • 面试必问之JVM原理

    面试必问之JVM原理1 什么是 JVMJVM 是 JavaVirtualM Java 虚拟机 的缩写 JVM 是一种用于计算设备的规范 它是一个虚构出来的计算机 是通过在实际的计算机上仿真模拟各种计算机功能来实现的 Java 虚拟机包括一套字节码指令集 一组寄存器 一个栈 一个垃圾回收堆和一个存储方法域 JVM 屏蔽了与具体操作系统平台相关的信息 使 Java 程序只需生成在 Java 虚拟机上运行的目标代码 字节码

    2026年3月17日
    2
  • PyCharm使用教程(mac版教程)

    PyCharm使用教程(mac版教程)1 修改 PyCharm 的主题 字体等 2 添加插件 点击 Plusins 然后在搜索框中可以搜索需要的插件 然后点击 install 安装 3 开始创建项目设置路径 点击 create 创建 如下目录是我们刚才创建后 自动生成的目录 创建 Python 文件输入文件名称 如何允许当前项目 打开控制台 然后点击绿色的运行按钮

    2026年3月27日
    2
  • 家传50种小咸菜的制造方式

    家传50种小咸菜的制造方式点击图片翻页点击图片翻页 1 酱八宝菜 黄瓜 1000 克 藕 豆角 800 克 红豆 400 克 花生米 300 克 栗子仁 200 克 核桃仁 100 克 杏仁 100 克 以上原料应先行腌制好 黄酱 2000 克 糖色 100 克 酱油 1000 克 将以上原料均加工成大小均等的外形混杂在

    2026年3月17日
    1
  • 惠普笔记本连接不了无线网_惠普电脑连接不了无线网

    惠普笔记本连接不了无线网_惠普电脑连接不了无线网关于惠普电脑连不上无线网的问题,一些网友不太清楚该怎么办,那么下面就由学习啦小编来给你们说说惠普电脑连不上无线网的解决方法吧,希望可以帮到你们哦!惠普电脑连不上无线网的解决方法一:电脑连不上wifi,图标会有黄色叹号(我的连上所以没有),在右下角右键点击无线wifi图标,再点击打开网络和共享中心。在网络和共享中心里面点击左上角的更改适配器设置。进去以后一般可以看到3个连接,一个是蓝牙的,一个是有线…

    2022年8月13日
    7
  • oracle删除数据索引还会在吗_索引数据频繁修改

    oracle删除数据索引还会在吗_索引数据频繁修改首先查到表中的现有索引:select*fromuser_indexeswheretable_namein(‘表名’,”);删除索引:dropindex索引名;

    2025年9月14日
    8

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号