在java中,每个对象都有两个池,锁(monitor)池和等待池

wait() ,notifyAll(),notify() 三个方法都是Object类中的方法.

锁池:假设线程A已经拥有了某个对象(注意:不是类)的锁,而其它的线程想要调用这个对象的某个synchronized方法(或者synchronized块),由于这些线程在进入对象的synchronized方法之前必须先获得该对象的锁的拥有权,但是该对象的锁目前正被线程A拥有,所以这些线程就进入了该对象的锁池中。

等待池:假设一个线程A调用了某个对象的wait()方法,线程A就会释放该对象的锁(因为wait()方法必须出现在synchronized中,这样自然在执行wait()方法之前线程A就已经拥有了该对象的锁),同时线程A就进入到了该对象的等待池中。如果另外的一个线程调用了相同对象的notifyAll()方法,那么处于该对象的等待池中的线程就会全部进入该对象的锁池中,准备争夺锁的拥有权。如果另外的一个线程调用了相同对象的notify()方法,那么仅仅有一个处于该对象的等待池中的线程(随机)会进入该对象的锁池.

下面通过一个例子来说明:

要求写两个线程,一个线程将某个对象的某个成员变量的值加1,而另外一个线程将这个成员变量的值减1.使得该变量的值始终处于[0,2].初始值为0.

[java] view plaincopy
  1. package com.tju;
  2. class Target
  3. {
  4. private int count;
  5. public synchronized void increase()
  6. {
  7. if(count == 2)
  8. {
  9. try
  10. {
  11. wait();
  12. }
  13. catch (InterruptedException e)
  14. {
  15. e.printStackTrace();
  16. }
  17. }
  18. count++;
  19. System.out.println(Thread.currentThread().getName() + ":" + count);
  20. notify();
  21. }
  22. public synchronized void decrease()
  23. {
  24. if(count == 0)
  25. {
  26. try
  27. {
  28. //等待,由于Decrease线程调用的该方法,
  29. //所以Decrease线程进入对象t(main函数中实例化的)的等待池,并且释放对象t的锁
  30. wait();//Object类的方法
  31. }
  32. catch (InterruptedException e)
  33. {
  34. e.printStackTrace();
  35. }
  36. }
  37. count--;
  38. System.out.println(Thread.currentThread().getName() + ":" + count);
  39. //唤醒线程Increase,Increase线程从等待池到锁池
  40. notify();
  41. }
  42. }
  43. class Increase extends Thread
  44. {
  45. private Target t;
  46. public Increase(Target t)
  47. {
  48. this.t = t;
  49. }
  50. @Override
  51. public void run()
  52. {
  53. for(int i = 0 ;i < 30; i++)
  54. {
  55. try
  56. {
  57. Thread.sleep((long)(Math.random()*500));
  58. }
  59. catch (InterruptedException e)
  60. {
  61. e.printStackTrace();
  62. }
  63. t.increase();
  64. }
  65. }
  66. }
  67. class Decrease extends Thread
  68. {
  69. private Target t;
  70. public Decrease(Target t)
  71. {
  72. this.t = t;
  73. }
  74. @Override
  75. public void run()
  76. {
  77. for(int i = 0 ; i < 30 ; i++)
  78. {
  79. try
  80. {
  81. //随机睡眠0~500毫秒
  82. //sleep方法的调用,不会释放对象t的锁
  83. Thread.sleep((long)(Math.random()*500));
  84. }
  85. catch (InterruptedException e)
  86. {
  87. e.printStackTrace();
  88. }
  89. t.decrease();
  90. }
  91. }
  92. }
  93. public class Test
  94. {
  95. public static void main(String[] args)
  96. {
  97. Target t = new Target();
  98. Thread t1 = new Increase(t);
  99. t1.setName("Increase");
  100. Thread t2 = new Decrease(t);
  101. t2.setName("Decrease");
  102. t1.start();
  103. t2.start();
  104. }
  105. }

java中的锁池和等待池相关推荐

  1. java加锁等待_java中的锁池和等待池

    在java中,每个对象都有两个池,锁(monitor)池和等待池 wait() ,notifyAll(),notify() 三个方法都是Object类中的方法. 锁池:假设线程A已经拥有了某个对象(注 ...

  2. java设置等待锁的时间_java的锁池和等待池

    谢邀.不知道题中的一段文字出自何处."锁池"和"等待池"这种翻译我还是头一回见.不过,题主的思路已经对了,即不拘泥于文字,而是在考虑这两个东西在锁的调度(即决定 ...

  3. 【Java多线程】了解线程的锁池和等待池概念

    文章目录 一.内置锁 二.线程状态 线程的5种状态 线程状态图 线程释放锁的情况 线程阻塞和线程等待的区别 sleep.join.yield.wait区别 yield不释放锁案例 sleep不释放锁案 ...

  4. Java中堆、栈、常量池等概念解析

    Java中堆.栈.常量池等概念解析 程序运行时,我们最好对数据保存到什么地方做到心中有数.特别要注意的是内存的分配.有六个地方都可以保存数据: (1) 寄存器.这是最快的保存区域,因为它位于和其他所有 ...

  5. java中使用Semaphore构建阻塞对象池

    java中使用Semaphore构建阻塞对象池 Semaphore是java 5中引入的概念,叫做计数信号量.主要用来控制同时访问某个特定资源的访问数量或者执行某个操作的数量. Semaphore中定 ...

  6. java堆和栈 常量池_GitHub - han-guang-xue/difference-of-stack-heap-pool: Java中堆、栈和常量池的区别...

    Java中堆.栈和常量池的区别 栈 堆 常量池的概念 首先我们先了解一下概念,Java把内存分成两种,一种叫做栈内存,一种叫做堆内存. 栈内存 存放基本类型的变量数据和对象类型的引用(请注意存放的是引 ...

  7. Java中的锁原理、锁优化、CAS、AQS详解

    点击上方"方志朋",选择"设为星标" 回复"666"获取新整理的面试文章 作者:景小财 www.jianshu.com/p/e674ee68 ...

  8. 一篇blog带你了解java中的锁

    前言 最近在复习锁这一块,对java中的锁进行整理,本文介绍各种锁,希望给大家带来帮助. Java的锁 乐观锁 乐观锁是一种乐观思想,即认为读多写少,遇到并发写的可能性低,每次去拿数据的时候都认为别人 ...

  9. Java中的锁[原理、锁优化、CAS、AQS]

    点击上方 好好学java ,选择 星标 公众号 重磅资讯.干货,第一时间送达 今日推荐:用好Java中的枚举,真的没有那么简单!个人原创+1博客:点击前往,查看更多 作者:高广超 链接:https:/ ...

最新文章

  1. 聊一聊:请假不想说真实原因,你都怎么跟领导讲?
  2. 我的HTML学习记录(七)
  3. vim循环下表复制_Vim求生手册,让你离“Vim党”更近一步!
  4. Apache 重写规则的常见应用 (rewrite)
  5. 地球空间与数字测绘知识总结
  6. 阿里巴巴Java开发手册(开发规范)——编程规约笔记
  7. OPENGGL深度测试
  8. 域名行业将带来高达98亿美元的巨大商机
  9. 二分查找的变体 —— Fibnaccian Search
  10. SpringBoot→请求参数、返回参数、文件上传、拦截器、异常处理、定时任务、异步任务
  11. html gzip解压易语言,易语言GZIP解压缩源码
  12. html 点击按钮刷新验证码,HTML点击刷新验证码
  13. HTML页面制作中出现的问题,网页制作过程中的普遍问题分析
  14. 虚拟化中常见的三种硬盘模式
  15. 【学习笔记】Python之 pdf 下载、合并
  16. 2019年上半年软件设计师下午试题
  17. 蓝桥杯--模拟1 AcWing 1241. 外卖店优先级
  18. 微信自定义菜单和个性化菜单添加emoji表情(兼容ios和安卓,防止小方框)
  19. java固定资产设备管理系统(源码开源分享)
  20. 微信小程序本地图片在开发工具显示手机预览不显示

热门文章

  1. pads中如何设置等长_如何在Windows 10中设置和使用Hyper-V进行OS虚拟化
  2. Qt信号和槽的连接--发射信号而槽未响应
  3. shell解析xml文件
  4. android源码灭屏时蓝牙自动配对
  5. 国内的Android SDK镜像
  6. 十大经典算法总结(JavaScript描述)
  7. Android Camera数据流分析全程记录(overlay方式二)
  8. 线性代数-求解地球法线
  9. tensorflow之train.get_checkpoint_state
  10. netcore之判断系统