java wait源码_Java精通并发-透过openjdk源码分析wait与notify方法的本地实现

上一次https://www.cnblogs.com/webor2006/p/11442551.html中通过openjdk从c++的底层来审视了ObjectMonitor的底层实现,这次继续来探究底层,对于wait()和notify()的底层细节到底是啥样的呢?下面还是先来到openjdk中来打开ObjectMonitor.hpp,其中它里面有一个很重要的类:

74cc6754e32e493da6eee6927c9b4263.png

然后我们要分析的wait()和notify()是在它的cpp实现文件中,所以打开ObjectMonitor.cpp来直奔主题:

91ec793d776f022ab90e7b5d59d95987.png

ac6761e83380c3783b175a34481dd44a.png

其中我们在Java层看到的wait()方法的最终实现就是这个cpp中的这个方法:

f7c282d432d73227ba997997ead1faf0.png

先纵览一下该方法的实现,代码量比较多,有将近200多行的代码,全部看通是不可能的,挑重点的来看:

9285b4276c9c522efa04abbcb83fe1d8.png

而Self其实是一个线程:

78d7195c3c138cdb999437116dcd6b1c.png

所以这句话的是将线程包装成了ObjectWaiter对象了:

333843c67b33cc025645a4bef7338dc1.png

另外会将状态改为等待状态:

d956ab17b02bc167f74299b12aaa71b0.png

另外,在上次的理论中我们知道在调用了wait()之后,会将其加入到WaitSet当中,如:

dcec4b7a0b7d8ad175f75827a1c76e9a.png

那么。。具体对应的底层代码在哪呢?看下面:

2805487b9bd0e59b61b6b3a2a946082d.png

好,下面来瞅一下它的具体实现:

6b41522d4f024f72174e66783c8445f4.png

再回到wait()方法继续,其中可以看到有自旋锁的东东:

30185a81e55d2432b686aa02c3e4ffaf.png

2432602afc4dce4a95498eec15fa4b4b.png

下面简单的纵览一下它:

d513da9278a31b0c84f09968cb713a2c.png

好,下面再来观测一下notify()方法的细节:

a17e1afa14c8d6671f48b8be0c26e325.png

5c40fdf203a4a124462b242d670d1abf.png

a569f502e2998c0d5ca9d2f5b35973a9.png

咱们看一下DequeueWaiter()方法是怎么实现的:

bf2891ee8b7329464f0bb2570f6ded87.png

回到主流程:

c0a6b872eb7a488283439a574115b41a.png

其实在notify()的官网中也有类似的说明:

2628f87d416dc43c1a2a88e4bbcce88f.png

而文档中提到的“具体实现”其实就是如我们看到cpp中这块的代码,不同的策略其实现也不一样。

照我们之前的理论来说,唤醒的线程会被放到EntryList当中:

a9bfe3fea684e5ca836f60e98db40b71.png

在notify()代码中也能看到:

73400c17622906968b4737d34bafa282.png

然后最后会看到有一个这个代码:

42cf7630f52c6a04480d6349714ed88e.png

以上就是从底层c++的角度来审视我们在java上调用的wait()和notify()的具体细节,虽说大致看了一下主流程,实际工作也没啥大的作用,但是!!!对我们的更深入的理解起到了非常重要的作用,毕境可以让你能更加自信的用Java的这些API。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/261215.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

jquery实现多级下拉菜单

支持多种浏览器&#xff0c;体验效果&#xff1a;http://keleyi.com/keleyi/phtml/jqmenu/4.htm多级菜单&#xff0c;理论上支持无限多的层级&#xff0c;文件结构非常简单的&#xff0c;以下是完整代码&#xff1a; 1 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 T…

listActivity和ExpandableListActivity的简单用法

今天自己简单的总结了listActivity和ExpandableListActivity二者的简单用法。 首先&#xff0c;先说一下listActivity的用法&#xff1a; ListActivity是一个绑定到一个数据源&#xff0c;并且用来显示这一串数据的Activity。ListActivity拥有一个listview对象来实现数据源的绑…

搭建git for windows服务器(100%可以成功)【转】

转自&#xff1a;http://blog.csdn.net/code_style/article/details/38764203 既然Git在linux下面非常好用&#xff0c;为什么还要搭建git windows的服务器&#xff0c;因为不是所有的用户都需要在linux下面做开发&#xff0c;对吧&#xff0c;还有很多用户选择使用windows做开…

eclipser认java源码_java相关:Eclipse查看开发包jar里源代码的方法

java相关&#xff1a;Eclipse查看开发包jar里源代码的方法发布于 2020-5-21|复制链接摘记: Eclipse查看开发包jar里源代码的方法前言&#xff1a;最近我打算学习一下谷歌的类库Guava&#xff0c;下载了Guava-r09.jar包及其源码&#xff0c;为了可以方面的看其源码&#xff0c;我…

php归档函数(按时间)实现

今日开发本站需要用到按时间归档文章的功能&#xff0c;即按文档发布时间将文章文类&#xff0c;以实现检索和统计功能&#xff0c;于是自己写了一个&#xff0c; 现分享给大家&#xff0c;相信大家工作和学习中有可能会用到&#xff0c;实现原理很简单&#xff0c;即取出文章发…

【转】高性能WEB开发系列之重绘与回流

原文转载&#xff1a;http://www.cnblogs.com/wangzhichao/archive/2011/05/16/2047633.html页面呈现流程 在讨论页面重绘、回流之前。需要对页面的呈现流程有些了解&#xff0c;页面是怎么把html结合css等显示到浏览器上的&#xff0c;下面的流程图显示了浏览器对页面的呈现的…

java字符串颠倒位置_java字符串第一个字符与最后一个字符颠倒位置测试

最近做了一个需求&#xff0c;就是 通过OA 连接到我们系统&#xff0c;然后request里 带有base64加密后的字符串&#xff0c;并且第一个与最后一个位置颠倒了&#xff0c;所以需要先恢复正常的加密串&#xff0c;然后在解密。所以首先工作是 先测试还原加密串&#xff0c;就是第…

C#自定义特性实例

元数据,就是C#中封装的一些类,无法修改.类成员的特性被称为元数据中的注释. 1、什么是特性 &#xff08;1&#xff09;属性与特性的区别 属性(Property)&#xff1a;属性是面向对象思想里所说的封装在类里面的数据字段&#xff0c;Get&#xff0c;Set方法。 特性(Attribute): …

UVA 10054 the necklace 欧拉回路

有n个珠子&#xff0c;每颗珠子有左右两边两种颜色&#xff0c;颜色有1~50种&#xff0c;问你能不能把这些珠子按照相接的地方颜色相同串成一个环。 可以认为有50个点&#xff0c;用n条边它们相连&#xff0c;问你能不能找出包含所有边的欧拉回路 首先判断是否在一个联通分量中…

解决tsvncache.exe引起电脑慢的问题

如果你觉得SVN的cache程序使得你的机器反应很慢的话,那可以参考这个方案.不过可能要改变你以前使用习惯.这个方案有两部分,第一部分是关闭SVN的cache监视;第二部分是显示文件差异时,使用SVN的“check for modifications”显示差异。 1.关闭SVN的cache监视。即关闭tsvncache.exe…

重构-改善既有代码的设计(1)

1&#xff0c;建立可靠地测试环境 2,寻找要重构的代码&#xff08;函数或者类&#xff09; 一般为比较长的函数&#xff0c;或者逻辑混乱的类 3&#xff0c;重构后的函数要修改局部变量&#xff0c;增加程序的可读行 4&#xff0c;函数应该放在它所使用的数据的所属对象内&…

[数据结构与算法] 单链表的简单demo

Vc6之下编译通过。。 1 /*******************************************************2 * : Project: 单链表数据结构演示3 * : File: link_list.h4 * : Function&#xff1a; 提供单链表操作的数据结构定义及方法声明5 * : History: 2013-10-01 22:37:056 * : Auth…

c++ 17介绍

作者&#xff1a;hearts zh链接&#xff1a;https://www.zhihu.com/question/32222337/answer/55238928来源&#xff1a;知乎著作权归作者所有。商业转载请联系作者获得授权&#xff0c;非商业转载请注明出处。其实现在的proposal很多很多&#xff0c;不出意外也会有相当一部分…

HTML5本地存储不完全指南

历史 在HTML5本地存储之前&#xff0c;如果我们想在客户端保存持久化数据&#xff0c;有这么几个选择&#xff1a; HTTP cookie。HTTP cookie的缺点很明显&#xff0c;最多只能存储4KB的数据&#xff0c;每个HTTP请求都会被传送回服务器&#xff0c;明文传输&#xff08;除非你…

php面向对象编程详解,PHP面向对象编程

3.3 类的定义和实例化date_default_timezone_set("PRC");/*** 1. 类的定义以class关键字开始&#xff0c;后面跟着这个类的名称。类的名称命名通常每个单词的第一个字母大写。* 2. 定义类的属性* 3. 定义类的方法* 4. 实例化类的对象* 5. 使用对象的属性和方法*/c…

[Postgres]Postgres复制表

在需要把含有分表的总表备份的时候想到的笨办法&#xff0c;如果有什么更先进的办法万望告知。 比如TableOld是由TableOld1,TableOld2,TableOld3组合而成&#xff0c;现在需要对TableOld进行备份。 复制表带数据 select * into TableNew from TableOld; 复制表结构 select * in…

“高考”机器人横空出世 2017年居然要考“大学”

文/辛东方&#xff0c;80后作家、专栏作者、专注互联网科技领域人工智能的发展&#xff0c;科学技术的全力配合&#xff0c;已经把人类的智慧实实在在的体现到了智能化设备上。按照目前的发展速度&#xff0c;人工智能要想真正突破技术难关&#xff0c;达到进一步的智能化&…

谁说菜鸟不会数据分析--数据分析那些事儿

一、数据分析是“神马” 1、 何谓数据分析 简单来说&#xff0c;数据分析就是对数据进行分析&#xff0c;较为专业的说法&#xff0c;数据分析是指用适当的统计分析方法对收集来的大量数据进行分析&#xff0c;将它们加以汇总、理解并消化&#xff0c;以求最大化地开发数据的功…

优集品 php,从细节处着眼 优集品打造成人世界的儿童节

在各大电商企业仍旧在史上最大规模的价格战中拼的不可开交之时&#xff0c;重视用户体验度&#xff0c;以商品传递生活理念而知名的全球优选设计百货--LivePort优集品(http://www.liveport.cn/)&#xff0c;已然细心的为眼下即将来临的六一儿童节策划了一餐盛宴&#xff0c;为追…

百万级并发 Node.js也能行

http://www.csdn.net/article/2012-08-21/2808861 转载于:https://www.cnblogs.com/myblog1314/p/3365157.html