java偏向锁,轻量级锁与重量级锁为什么会相互膨胀?

发布于 2022-09-04 08:07:21 字数 221 浏览 8 评论 0

正在看《深入理解java虚拟机》 对于锁膨胀不是很明白。
首先偏向锁,我理解偏向锁和轻量级锁之间区别是在获取锁的过程中,是否有CAS操作。但是为什么偏向锁不能直接替代轻量级锁,什么场景是轻量级锁能够解决但是偏向锁无法解决的呢?

第二个 书上402页上面说“如果有两条以上的线程竞争用同一个锁,轻量级锁就不再有效,要膨胀为重量级锁”,我的理解上不需要大于两个线程,等于两个线程的竞争情况下,也需要膨胀对吗?

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

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

发布评论

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

评论(2

凤舞天涯 2022-09-11 08:07:21

为什么需要这么多锁?因为不同的锁占用的资源不同,一切都是为了使用更少的资源,并且程序执行更快。

第一个问题。
偏向锁: Hotspot的作者经过以往的研究发现大多数情况下锁不仅不存在多线程竞争,而且总是由同一线程多次获得,为了让线程获得锁的代价更低而引入了偏向锁。适用于一个线程访问同步代码块的场景。

轻量级锁: 用于竞争不是很激烈或同步代码块执行很快的场景,它不会阻塞,而是自旋。(自旋几次还没获取到锁升级为重量级锁)

第二个问题,轻量级锁自旋几次后还没得到锁(自旋可以理解为循环),不管几个线程都会膨胀。

以上为个人理解,可参考Infoq的这篇文章

时间海 2022-09-11 08:07:21

偏向锁适用的是完全没有出现竞争时的情况,使用偏向锁时,线程只有在获取锁的时候有cas操作,而释放锁的时候不会有,一旦出现锁竞争,就会膨胀为轻量级锁。
轻量级锁适用的是出现了锁竞争,但锁被占有的时间非常短的情况。使用轻量级锁时,线程在获取锁和释放锁的时候都要cas操作,所以性能消耗要大于偏向锁,当锁被占用时间过长的时候,轻量级锁就会膨胀为重量级锁。

所以当没有出现线程竞争的时候,相对于偏向锁,轻量级锁多出来的cas操作将会产生更多的性能消耗

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