锁升级

作者: ssochi | 来源:发表于2019-12-23 17:20 被阅读0次

状态转换

未加锁 -> 偏向锁 -> 轻量锁(自旋锁) -> 重量锁

偏向锁

当对象未被加锁,而有加锁请求,那么将对象头中记录持有锁的ThreadID.
之后若有线程再次访问,

  1. ThreadID与自己的ThreadID一致则直接获取锁
  2. ThreadID与自己不一致则锁升级为轻量级锁

偏向锁的好处是,大部分的锁并不会发生竞争,因此需要用最小的成本去实现锁.

轻量级锁

轻量级锁也叫自旋锁,当锁从偏向锁升级后,就成了轻量级锁.
要获取轻量级锁需要在获取锁的线程的栈帧中复制一份锁对象的MarkWord,MarkWord为对象头的一部分,存储了对象的hashcode和gc信息.获取锁线程尝试使用CAS来修改锁对象的MarkWord,将之修改为自己复制的MarkWord的地址.
若多次CAS失败,表示锁竞争强烈,那么轻量级锁会升级为重量级锁

注意:轻量级锁升级问重量级锁之后,不会再变回轻量级锁.

轻量级锁的优点是:在线程持有锁时间非常短的时候,是用重量级锁会造成线程不断的被挂起,这会导致大量的上下文切换,是非常耗时的.而这时使用自旋,CPU吞吐量更高.

重量级锁

重量级锁直接将对象头的MarkWord设为指向Mutex的指针,而Mutex为操作系统实现的互斥锁.

优点:等待时直接挂起线程,不用轮训来消耗CPU

相关文章

  • 锁升级

    什么是锁升级?(Lock Escalation) 指将当前锁的粒度降低。比如: 把行锁升级为页锁。 将页锁升级为表...

  • java提高班2-Synchronized 加锁原理

    锁升级过程 无锁 -> 偏向锁 -> 轻量级锁 -> 重量级锁 锁升级原理图 无锁 -> 偏向锁 线程T1请求sy...

  • 多线程中 synchronized 锁升级,偏向锁>轻量级锁>重

    多线程中 synchronized 锁升级的原理是什么? synchronized 锁升级原理:在锁对象的对象头里...

  • 锁的四种状态

    锁的状态总共四种:无锁状态、偏向锁、轻量级锁和重量级锁。随着锁的竞争,锁可以从偏向锁升级到轻量级锁,再升级到重量级...

  • 27、说说什么是锁升级?

    说说什么是锁升级? MySQL 行锁只能加在索引上,如果操作不走索引,就会升级为表锁。因为 InnoDB 的行锁是...

  • 锁升级

    状态转换 未加锁 -> 偏向锁 -> 轻量锁(自旋锁) -> 重量锁 偏向锁 当对象未被加锁,而有加锁请求,那么将...

  • 锁升级

    https://blog.csdn.net/tongdanping/article/details/7964733...

  • 锁升级

    对象元信息 在JVM当中,一个Java对象的内存主要有三块: 对象头,对象头包含两部分数据,分别是Mark wor...

  • JUC框架说明

    synchronized 锁升级:偏向锁 -》轻量级锁 -》重量级锁 1、同步状态的原子性管理 ...

  • 阿里面试失败后,一气之下我图解了Java中18把锁

    乐观锁和悲观锁 独占锁和共享锁 互斥锁和读写锁 公平锁和非公平锁 可重入锁 自旋锁 分段锁 锁升级(无锁|偏向锁|...

网友评论

      本文标题:锁升级

      本文链接:https://www.haomeiwen.com/subject/smsbaftx.html