java 中的锁池(monitor)和等待池(waitset)

JAVA herman 1552浏览
公告:“业余草”微信公众号提供免费CSDN下载服务(只下Java资源),关注业余草微信公众号,添加作者微信:xttblog,发送下载链接帮助你免费下载!
本博客日IP超过1800,PV 2600 左右,急需赞助商。
极客时间所有课程通过我的二维码购买后返现24元微信红包,请加博主新的微信号:xttblog,之前的微信号好友位已满,备注:返现
所有面试题(java、前端、数据库、springboot等)一网打尽,请关注文末小程序
视频教程免费领

程序就是模仿世界!比如队列就是模仿人们的排队场景,再比如工厂模式,代理模式等都是和现实生活息息相关的场景衍生而来。在前面还记得我们的 synchronized 锁吗?还记得 Object 的 wait 方法吗?它们分别有各自的池,及:锁池和等待池。本文结合前面的内容来说说 java 中的锁池和等待池。

java 中的锁池(monitor)和等待池(waitset)

wait()方法

wait() 使当前线程处于等待状态,直到另外的线程调用 notify 或 notifyAll 将它唤醒。但是在等待唤醒的期间,它处在等待唤醒的池子中,也就是我们所说的等待池中。当调用 wait() 方法后,会释放锁,进入等待池。当调用 notify() 或 notifyAll() 后唤醒该对象监听的其中一个或所有线程(规则取决于JVM厂商,FILO,FIFO,随机…)。

等待池

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

wait() 对应等待池,synchronized 对应锁池。

加了 synchronized 关键字的地方就会有相应的获取锁的步骤。未竞争到锁的线程会加入到锁池。

锁池

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

等待池和锁池中的资源只要重新获得了对象的拥有权,那么就会被对应的池剔除。

上面这两个内容也是很多高级开发人员的知识漏洞,线程方面问的深了,问的细了照样漏洞百出!

业余草公众号

最后,欢迎关注我的个人微信公众号:业余草(yyucao)!可加QQ1群:135430763(2000人群已满),QQ2群:454796847(已满),QQ3群:187424846(已满)。QQ群进群密码:xttblog,想加微信群的朋友,之前的微信号好友已满,请加博主新的微信号:xttblog,备注:“xttblog”,添加博主微信拉你进群。备注错误不会同意好友申请。再次感谢您的关注!后续有精彩内容会第一时间发给您!原创文章投稿请发送至532009913@qq.com邮箱。商务合作可添加助理微信进行沟通!

本文原文出处:业余草: » java 中的锁池(monitor)和等待池(waitset)