synchronized重入和升级

发布于 2022-09-13 00:34:49 字数 145 浏览 27 评论 0

假设程序刚开始跑, 只有一个线程在那重入, 一个线程应该是偏向锁的情况,那它是怎么控制重入次数的呢?
如果再来几个线程,就变成重量级锁了, 如果这个线程已经重入了10次还在跑。
重量级锁在在moniter中记录, 那这10次在偏向锁以及轻量级锁的时候会记录在哪里

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

猫性小仙女 2022-09-20 00:34:49

偏向锁没有次数这一说,会在监视器头里记录线程ID,如果一直是这个ID,就相当于无锁状态。线程重入没太明白你的意思,一般说的是锁重入。猜测你说的是锁重入。偏向锁中单个线程中锁重入,也相当于是没锁。而轻量级锁,如果mark word 和 栈上displace 的交换失败,依然会检查是否当前线程获取了锁,如果获取了,就继续执行,如果不是当前线程获取了,说明出现了线程争抢,开始膨胀为重量级锁。参考《深入理解java虚拟机》锁优化那一章节。

红颜悴 2022-09-20 00:34:49
  • synchronized是通过 Monitor 实现,也就是 monitorenter 和 monitorexit
  • 执行monitorenter 指令的时候会去尝试获取对象的锁
  • 如果对象没有被锁定或者当前线程已经持有了对象的锁,则锁的计数器加一

如果一个线程在重入就是不停的在执行monitorenter、monitorexit。当他判断自己已经获取到对象的锁时,就只是计数器加一。偏向锁或者轻量级锁、重量级锁都是只是获取锁的方式,跟计数器不是一个逻辑。

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文