面试题:Jvm的Hotspot的锁升级?

这边主要有三种锁的名词:偏向锁自旋锁重量级锁

之前《Java锁synchronized关键字原理的Mark Word理解》这篇文章有讲到synchronized的一些实现原理,就是在存储的Java对象的头信息里记录线程的一些信息,其中就有记录是否是偏向锁。

当线程A第一次拿到锁后,会在头信息里记录下线程A的id,然后当下次如果还是线程A拿到锁进来,那jvm就直接根据是否是偏向锁来决定是否允许它进来,也就是说这个时候其实并没有涉及到真正的锁,只是一个简单的判断。

当线程B准备竞争锁时,它会先进入到一个轻量级的锁——自旋锁,这时就相当于一个while循环(默认是10次),这时主要消耗的是cpu资源。

当自旋超过10次后,这时就会像线程C那样,开始升级申请操作系统的重量级锁,然后进入等待队列。

从中可以看出,当业务里有大量耗时长的线程时,是不适宜使用自旋锁的,因为那将非常消耗cpu资源。

0

发表评论

邮箱地址不会被公开。