Object类九大方法之notify和notifyAll方法

notify()方法表示,当前的线程已经放弃对资源的占有, 通知等待的线程来获得对资源的占有权,但是只有一个线程能够从wait状态中恢复,然后继续运行wait()后面的语句;只会唤醒等待该锁的其中一个线程。
notifyAll()方法表示,当前的线程已经放弃对资源的占有, 通知所有的等待线程从wait()方法后的语句开始运行; 唤醒等待该锁的所有线程。

对象内部锁

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

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

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

eg:

有两个生产者A和B,两个消费者C和D,以及一个长度为1的队列。

初始状态,这四个线程全部进入锁池,等待抢占锁。
C获取到锁,但是队列为空,故C进入等待池。
D获取到锁,但是队列为空,故D进入等待池。
A获取到锁,生产,队列满,调用notify,唤醒一个线程。由于此时C和D都在等待池中,所以会有一个线程从等待池进入锁池,假设此处C进入锁池。
此时,锁池有B和C两个线程,假设B获取到了锁,但是队列满,故B进入等待池,放弃锁。
此时,C获取到锁,消费,notify,由于此时等待池有两个线程B和D,假如唤醒的是B,没问题开始生产,但是若唤醒的是D,则因队列为空,继续wait。

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

Object类九大方法之notify和notifyAll方法相关推荐

  1. Object类九大方法之wait方法

    Object类九大方法之wait方法 wait.notify和notifyAll方法是Object类的final native方法.所以这些方法不能被子类重写,Object类是所有类的超类,因此在程序 ...

  2. Object类九大方法之finalize方法

    Object类九大方法之finalize方法 finalize()是Object的protected方法,子类可以覆盖该方法以实现资源清理工作,GC在回收对象之前调用该方法. finalize的作用 ...

  3. Object类九大方法之getClass方法

    Object类九大方法之getClass方法 https://www.cnblogs.com/wsw-bk/p/8026266.html 获取此Object的运行时类. 什么是运行时类? 在创建对象前 ...

  4. 为什么wait、notify、notifyAll方法定义在Object中而不是Thread类中

    多线程概述 Java是一个支持多线程的开发语言,多线程并发执行任务可以充分利用CPU资源,提高多任务并发执行效率(注意区分:多线程并不会加快任务的执行速度,而是可以充分利用多核CPU让线程轮流进行工作 ...

  5. 漫画:Object 类很大,你忍一下(完结篇)

    ‍‍ 作者 | 东风玖哥,小灰 来源 | 程序员小灰(ID:chengxuyuanxiaohui) 这一次,我们来重点讲解 wait(),notify(),notifyAll() 这三大方法. // ...

  6. 第五章 Java 中的 wait、notify 和 notifyAll 方法示例

    您可能已经注意到 Object 类具有三个 final 方法,分别称为 wait.notify 和 notifyAll.这些方法用于线程间通信.Java 5 引入了执行器框架,它为您处理线程间通信,并 ...

  7. 【面试题】notify() 和 notifyAll()方法的使用和区别

    [面试题]notify() 和 notifyAll()方法的使用和区别 Java中notify和notifyAll的区别 何时在Java中使用notify和notifyAll? [问]为什么wait( ...

  8. 为什么线程通信的方法wait(), notify()和notifyAll()被定义在Object类里

    关于wait().notify()的使用 public class WaitDemo {     public static Object object = new Object();        ...

  9. Object的wait、notify和notifyAll方法

    方法简介 wait方法 当一个线程调用一个共享变量的wait()方法时,该调用线程会被阻塞挂起(进入waiting状态),直到发生下面几件事情之一才能返回: 其他线程调用了该共享对象的notify() ...

最新文章

  1. 【使用 DOM】为DOM元素设置样式
  2. C#语言基础——7月21日
  3. concat特征融合_深度特征融合---理解add和concat之多层特征融合
  4. 如何部署Docker镜像到SAP Cloud Platform
  5. [python opencv 计算机视觉零基础到实战] 十八、用鼠标进行画画
  6. seo超强外部链接、内部链接技巧
  7. fileinputstream_Java I/O 流之 FileInputStream
  8. 用pyqt5做一个能python程序能插入图片的ide
  9. 微软:SolarWinds 供应链攻击事件幕后黑手攻击全球24国政府
  10. 想要定位其中的iframe并切进去的定位方法
  11. ubuntu14 lamp环境下安装swoole1.8.6
  12. utilities(matlab)—— 前馈网络权值矩阵初始化方式
  13. 那些年的UC人力外包扯淡
  14. java创建内部面板类_Java图形与文本(18)
  15. d2j-dex2jar之DexException :not support version
  16. 计算机网络在办公自动化的应用,浅析计算机网络在办公自动化中的作用
  17. 7-1 愿天下有情人都是失散多年的兄妹 (25 分)
  18. 【考研数学高数部分】无穷级数
  19. 基于javafx和mysql的C/S版影院管理系统
  20. LOJ 10155 - 「一本通 5.2 例 3」数字转换

热门文章

  1. OpenLayers实战(四)控制图标显示隐藏
  2. 关于BIOS的入口地址0xFFFF0
  3. 视频会议室需要什么设备可以实现高清视频会议?
  4. (六)苏世民:我的经验和教训:决策(12)
  5. 共享单车涉足区块链前景待考
  6. system分区签名校验方法
  7. 筱筱看博客(微信小程序、Lin-ui组件、vant Weapp)
  8. libc、glibc和glib的关系
  9. 抖音直播间千川投放有用吗?直播间投放分析有什么技巧
  10. 怎么在第一个 PDF 文件的中间,插入第二个 PDF 文件的内容?