码迷,mamicode.com
首页 > 其他好文 > 详细

ATTR ObjectMonitor::enter(TRAPS)

时间:2019-11-10 17:13:57      阅读:83      评论:0      收藏:0      [点我收藏+]

标签:就会   线程   lines   构造   mda   自旋   参数   rip   链接   

技术图片

 

 如上图,红框中表示OjectMonitor的enter方法一进来就通过CAS将OjectMonitor的_owner设置为当前线程,绿框中表示设置成功的逻辑,第一个if表示重入锁的逻辑,第二个if表示第一次设置_owner成功,都意味着竞争锁成功,而我们的线程C显然是竞争失败的,会进入下图中的无线循环,反复调用EnterI方法:
技术图片

 

 

进入EnterI方法看看:

 

技术图片

 

 

如上图,首先构造一个ObjectWaiter对象node,后面的for(;;)代码块中来是一段非常巧妙的代码,同一时刻可能有多个线程都竞争锁失败走进这个EnterI方法,所以在这个for循环中,用CAS将_cxq地址放入node的_next,也就是把node放到_cxq队列的首位,如果CAS失败,就表示其他线程把node放入到_cxq的首位了,所以通过for循环再放一次,只要成功,此node就一定在最新的_cxq队列的首位。
接下来的代码又是一个无限循环,如下图:

技术图片

 



从上图可以看出,进入循环后先调用TryLock方法竞争一次锁,如果成功了就退出循环,否则就调用Self->_ParkEvent->park方法使线程挂起,这里有自旋锁的逻辑,也就是park方法带了时间参数,就会在挂起一段时间后自动唤醒,如果不是自旋的条件,就一直挂起等待被其他条件唤醒,线程被唤醒后又会执行TryLock方法竞争一次锁,竞争不到继续这个for循环;

————————————————
版权声明:本文为CSDN博主「程序员欣宸」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/boling_cavalry/article/details/77793224

ATTR ObjectMonitor::enter(TRAPS)

标签:就会   线程   lines   构造   mda   自旋   参数   rip   链接   

原文地址:https://www.cnblogs.com/xiaofan156/p/11830835.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!