轻量级锁小伙伴们都知道吧?它是锁机制的其中一个状态,这次我们来看看如何在java中实现轻量级锁吧。
一、什么是轻量级锁?
首先我们先粗略复习一下轻量级锁,它是偏向锁的升级,偏向锁在运行一个线程进入同步块的情况下,这时第二个锁进入争抢,偏向锁就会升级为轻量级锁。
轻量级锁一般也被叫做非阻塞同步、乐观锁,因为它执行的这个过程并没有把线程阻塞挂起,反而让线程空循环等待,串行执行。
使用轻量级锁能够最大化减少性能消耗,但有个缺点,一旦多个线程同时竞争锁时,轻量级锁就会膨胀,成为重量级锁。
轻量级锁主要有两种:
a自旋锁
b自适应自旋锁
二、轻量级锁如何实现?
1)、加锁
java中,在当前线程执行同步块前,JVM会先在当前线程的栈桢中创建一个用于存储锁记录的空间,并把对象头中的Mark Word复制到锁记录中,之后线程尝试使用CAS将对象头中的Mark Word替换为指向锁记录的指针。如果成功,当前线程获得锁,如果失败,表示其他线程竞争锁,当前线程便尝试使用自旋来获取锁。
2)、解锁
轻量级锁在解锁时,会使用原子性的CAS操作将Displaced Mark Word替换回对象头,如若成功,表示没有竞争发生。失败的话,就表示当前锁存在竞争,锁就会膨胀成重量级锁。
膨胀过程:
以上就是关于轻量锁实现方式的所有内容了,小伙伴们如果还想了解更多锁机制常见问题的话就一直关注我们网站吧。
推荐阅读: