JVM锁优化总结

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/littlerobot/article/details/72954686

 自旋锁

适用场景:

适用于多cpu

前提:
a. 挂起先撤和恢复线程的操作需要转入内核态完成,这种操作给系统性能带来很大压力
b. 由与线程锁定状态一般很短,为了很短的一段时间挂起线程和恢复线程不值得

做法:

在一个线程锁定时,让后来的线程在另一个cpu上稍等一下,单不放弃cpu的执行时间,等待另一个线程释放锁

 消除锁

概念:

对一些代码上要求同步,但是检测到不存在共享数据竞争的锁进行消除

 粗化锁

概念:

如果一系列的操作对同一个对象反复加锁解锁,粗化锁就是把加锁同步范围扩大到操作序列的外部,将操作序列的多次加锁解锁变为一次加锁解锁


 轻量级锁

概念:

线程在进入同步块时,在线程当前栈帧中创建锁记录,通过CAS操作和锁对象的对象头交换说句,也就是说,对象头存的数据是指向线程栈帧中的锁记录的指针,且对象头标志位为00,线程栈帧中所记录存的是锁对象头的拷贝;解锁过程也是通过CAS实现的逆过程

前提:

传统说又成为重量级锁,是通过使用操作系统互斥量实现的,性能消耗大;对于绝大部分的锁,真个同步周期内都是不存在竞争的,这是一个经验数据

存在意义:

轻量级锁并不是用来代替重量级锁的,它的本意是在没有多线程竞争的前提下减少重量级锁使用操作系统互斥量产生的性能消耗

膨胀:

如果存在多个线程竞争同一个锁,那么轻量级锁不在有效,要彭长为重量级锁,所标志变为10,对象头存的是指向重量级锁(互斥量)的指针,后面等待的线程叫进入阻塞状态

缺点:

如果膨胀为重量级锁,因为存在额外的CAS操作,轻量级锁会比传统的重量级锁还要慢!


 偏向锁

概念:

如果当前虚拟机启用了片仙姑搜,那么,当锁对象被线程第一次获取时,虚拟机将会把对象头中的标志位更新为01,即偏向模式。同时使用CAS操作把获取到这个锁的线程ID记录到对象的对象头中,如果CAS操作成功,持有偏向锁的线程以后每次进入这个所相关的同步块是,虚拟机都可以不进行任何同步操作。

膨胀:

当有另一个线程尝试获取这个所时,偏向模式就宣告结束。根据锁对象目前是否处于被锁定状态,撤销偏向后恢复到未锁定状态或轻量级锁定状态。

阅读更多
换一批

没有更多推荐了,返回首页