ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

多线程

2020-06-04 16:52:35  阅读:235  来源: 互联网

标签:批量 撤销 epoch 线程 多线程 class 偏向


markword 中的 epoch:

批量重偏向与批量撤销渊源:从偏向锁的加锁解锁过程中可看出,当只有-个线程反复进入同步块时,偏向
锁带来的性能开销基本可以忽略,但是当有其他线程尝试获得锁时,就需要等到safe point时,再将偏向锁撤
销为无锁状态或升级为轻量级,会消耗-定的性能,所以在多线程竞争频繁的情况下,偏向锁不仅不能提高
性能,还会导致性能下降。于是,就有了批量重偏向与批量撤销的机制。
原理以clasp为单位,为每个class维护解决场景批量重偏向(bulk rebias)机制是为了解决:一个线程创建了
大量对象井执行了初始的同步操作,后来另-个线程也来将这些对象作为锁对象进行操作,这样会导致大量
的偏向锁撒销操作。批量撤销(bulk revoke)机制是为了解决:在明显多线程竞争剧烈的场景下使用偏向锁
是不合适的。
-个偏向锁撤销计数器,每一-次该class的对象发生偏向撤销操作时,该计数器+1,当这个值达到重偏向阈值
(默认20)时,JM就认为该Class的偏向锁有问题,因此会进行批量重偏向。每个class对象 会有一一个对应的
epoch字段,每个处于偏向锁状态对象的Mark Word中也有该字段,其初始值为创建该对象时class中的
epoch的值。每次发生批量重偏向时,就将该值+1,同时遍历JVM中所有线程的栈,找到该class所有正处于
加锁状态的偏向锁,将其epoch字 段改为新值。下次获得锁时,发现当前对象的epoch值和lass的epoch不相
等,那就算当前已经偏向了其他线程,也不会执行撤销操作。而是直接通过CAS操作将其Mark Word的
Thread Id改成当前线程Id.当达到重偏向阈值后,假设该classit 数器继续增长,当其达到批量撤销的阈值后
(默认40) , JM就认为该lass的使用场景存在多线程竞争,会标记该class为不可偏向, 之后,对于该class
的锁,直接走轻量级锁的逻辑。

 

mashibing.com/bird.html

标签:批量,撤销,epoch,线程,多线程,class,偏向
来源: https://www.cnblogs.com/wycBolg/p/13044567.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有