偏向锁、轻量级锁

偏向锁:

线程执行同步代码块时,首先检查JVM是否开启了偏向锁(1.6后默认是开启的),未开启的执行轻量级锁的流程。
**开启的话:**检查对象MarkWord中的偏向线程ID是否是当前线程,是的话,执行同步代码块。**若对象MarkWord的偏向线程ID不是当前线程ID **,则证明已经有线程已经持有了偏向锁。此时使用CAS尝试获取获取,获取成功执行同步代码。未获取到偏向锁的线程会在达到安全点时,暂停已经获取到偏向锁的线程,并将锁升级到 轻量级锁。升级以后,唤醒刚才被停止的持有偏向锁的线程(升级后现在是持有轻量级的锁),然后自己进行轻量级锁的获取(自旋)。

偏向锁可以通过JVM参数设置是否开启:当确定大部分同步代码一定存在多线程竞争,就可以关闭。因为开启反而带来额外的处理。

轻量级锁:

执行同步代码块时,线程在栈帧中分配一块叫做 Lock Record的区域,用来存储 对象的MarkWord与指向对象的指针。然后使用 CAS 将MarkWord部分区域置换为当前线程的Lock Record的引用,同时将锁状态标志置为00。
CAS成功则执行同步代码块,失败则自适应自旋继续CAS等待获取,若自适应时间内未获取到,则锁升级的重量级锁(MarkWord此时指向重量级的指针),该线程进入重量级锁的阻塞状态。
当获取到轻量级锁的线程执行完毕后,使用CAS进行解锁失败(MarkWord已经被置换为重量级锁的指针),则表明当前有线程在竞争,此时就会解锁(指的是重量级锁),然后唤醒之前未获取到锁而进入等待状态的线程。

猜你喜欢

转载自blog.csdn.net/qq_40728028/article/details/106412289