java的Object里wait()实现原理

更新时间:2023-07-06 09:48:28 阅读: 评论:0

人大代表建议格式java的Object⾥wait()实现原理
在进⾏wait()之前,就代表着需要争夺Synchorized,⽽Synchronized代码块通过javap⽣成的字节码中包含monitorenter和monitorexit两个指令。当在进加锁的时候会执⾏monitorenter指令,执⾏该指令可以获取对象的monitor。同时在执⾏Lock.wait()的时候也必须持有monitor对象。
在多核环境下,多个线程有可能同时执⾏monitorenter指令,并获取lock对象关联的monitor,但只有⼀个线程可以和monitor建⽴关联,这个线程执⾏到wait⽅法时,wait⽅法会将当前线程放⼊wait t,使其进⾏等待直到被唤醒,并放弃lock对象上的所有同步声明,意味着该线程释放了锁,其他线程可以重新执⾏加锁操作,notify⽅法会选择wait t中任意⼀个线程进⾏唤醒,notifyAll⽅法会唤醒monitor的wait t中所有线程。执⾏完notify⽅法并不会⽴马唤醒等待线程。那么wait具体是怎么实现的呢?
发酵酸奶
⾸先在HotSpot虚拟机中,monitor采⽤ObjectMonitor实现,每个线程都具有两个队列,分别为free和ud,⽤来存放ObjectMonitor。如果当前free列表为空,线程将向全局global list请求分配ObjectMonitor。
ObjectMonitor对象中有两个队列,都⽤来保存ObjectWaiter对象,分别是_WaitSet 和 _EntrySet。_owner⽤来指向获得ObjectMonitor对象的线程
蓝裙子
ObjectWaiter对象是双向链表结构,保存了_thread(当前线程)以及当前的状态TState等数据, 每个等待锁的线程都会被封装成ObjectWaiter对象。
无锡公园>蒜苗炒回锅肉
_WaitSet :处于wait状态的线程,会被加⼊到wait t;
_EntrySett:处于等待锁block状态的线程,会被加⼊到entry t;
wait⽅法实现:
有关春节的春联
lock.wait()⽅法最终通过ObjectMonitor的 wait(jlong millis, bool interruptable, TRAPS)实现
1、将当前线程封装成ObjectWaiter对象node
红星勋章
2、通过ObjectMonitor::AddWaiter⽅法将node添加到_WaitSet列表中
3、通过ObjectMonitor::exit⽅法释放当前的ObjectMonitor对象,这样其它竞争线程就可以获取该ObjectMonitor对象
电子小报
4、最终底层的park⽅法会挂起线程
ObjectSynchorizer::wait⽅法通过Object对象找到ObjectMonitor对象来调⽤⽅法 ObjectMonitor::wait(),通过调⽤ObjectMonitor::AddWaiter()可以把新建的ObjectWaiter对象,放⼊到_WaitSet队列的末尾,然后在ObjectMonitor::exit释放锁,接着通过执⾏thread_ParkEvent->park来挂起线程,也就是进⾏wait。

本文发布于:2023-07-06 09:48:28,感谢您对本站的认可!

本文链接:https://www.wtabcd.cn/fanwen/fan/82/1081517.html

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。

标签:线程   对象   唤醒
相关文章
留言与评论(共有 0 条评论)
   
验证码:
推荐文章
排行榜
Copyright ©2019-2022 Comsenz Inc.Powered by © 专利检索| 网站地图