【89、锁升级过程】

87 阅读1分钟

锁升级是指从轻量级锁升级到重量级锁的过程。在Java中,锁可以分为无锁、偏向锁、轻量级锁和重量级锁四种状态,它们的状态转换通常是隐式的,即由JVM自动完成的。下面是轻量级锁和重量级锁之间的升级过程:

轻量级锁加锁过程:当线程第一次获取锁时,JVM会先给锁对象的对象头设置一个指向线程栈中锁记录的指针,然后将锁对象的对象头中的Mark Word复制一份到线程栈中的锁记录中。

竞争情况下的轻量级锁升级:当多个线程竞争同一个锁时,轻量级锁就会升级为重量级锁。此时,JVM会使用一种叫做自旋锁的机制,即让线程进行忙等待,直到获取到锁为止。如果自旋等待超时或者线程被中断,那么轻量级锁就会升级为重量级锁。

重量级锁的加锁过程:当锁升级为重量级锁时,JVM会在操作系统层面使用互斥量来实现锁的控制。此时,每次线程获取锁都会进入阻塞状态,直到获取到锁为止。

总的来说,轻量级锁的加锁和解锁都比较快,适用于多个线程交替访问同一个锁对象的情况。但如果存在线程竞争的情况,那么轻量级锁就会升级为重量级锁,降低程序的并发性能。