阿里面试题:Java为什么要引入偏向锁?

这是一道来自阿里的面试题,在聊到锁的时候,阿里面试官引入了这个问题。我这里来简单的回答一下!

要回答这个问题,首先你要直到什么是偏向锁!

JDK1.6 对锁做了很多优化,轻量级锁和偏向锁是其中两种优化手段。引入偏向锁是为了在无多线程竞争的情况下尽量减少不必要的轻量级锁执行路径,因为轻量级锁的获取及释放依赖多次 CAS 原子指令,而偏向锁只需要在置换 ThreadID 的时候依赖一次 CAS 原子指令,代价就是一旦出现多线程竞争的情况就必须撤销偏向锁。

具体来说就是因为经过 HotSpot 的作者大量的研究发现,大多数时候是不存在锁竞争的,常常是一个线程多次获得同一个锁,因此如果每次都要竞争锁会增大很多没有必要付出的代价,为了降低获取锁的代价,才引入的偏向锁。

然后面试官又追问到偏向锁的升级过程?

其实,上面已经解答过了,可能解释的有些模糊,因此面试官又进一步的追问了。

假设线程 1 访问代码块并获取锁对象时,会在 Java 对象头和栈帧中记录偏向的锁的 threadID,因为偏向锁不会主动释放锁,因此以后线程 1 再次获取锁的时候,需要比较当前线程的 threadID 和 Java 对象头中的 threadID 是否一致。如果一致(还是线程 1 获取锁对象),则无需使用 CAS 来加锁、解锁;如果不一致(其他线程,如线程 2 要竞争锁对象,而偏向锁不会主动释放因此还是存储的线程 1 的 threadID),那么需要查看 Java 对象头中记录的线程 1 是否存活,如果没有存活,那么锁对象被重置为无锁状态,其它线程(线程 2)可以竞争将其设置为偏向锁;如果存活,那么立刻查找该线程(线程 1)的栈帧信息,如果还是需要继续持有这个锁对象,那么暂停当前线程 1,撤销偏向锁,升级为轻量级锁,如果线程 1 不再使用该锁对象,那么将锁对象状态设为无锁状态,重新偏向新的线程。

以上,只是面试过程中的一个简单的小问题,基础和原理还是很重要的!

阿里面试题:Java为什么要引入偏向锁?

: » 阿里面试题:Java为什么要引入偏向锁?

原创文章,作者:3628473679,如若转载,请注明出处:https://blog.ytso.com/252214.html

(0)
上一篇 2022年5月4日
下一篇 2022年5月4日

相关推荐

发表回复

登录后才能评论