欢迎关注头条号:Java小野猫

这三种锁是指锁的状态,并且是专门针对Synchronized关键字。JDK 1.6 为了减少"重量级锁"的性能消耗,引入了“偏向锁”和“轻量级锁”,锁一共拥有4种状态:无锁状态、偏向锁、轻量级锁、重量级锁。锁状态是通过对象头的Mark Word来进行标记的:

锁可以升级但不能降级,意味着偏向锁升级成轻量级锁后不能降级成偏向锁,这种锁升级却不能降级的策略,是为了提高获得锁和释放锁的效率

  1. 重量级锁:依赖于底层操作系统的Mutex Lock,线程会被阻塞住
  • 缺点:加锁和解锁需要从用户态切换到内核态,性能消耗较大
  1. 轻量级锁:基于重量级锁进行了优化(避免上下文切换,提高了性能),它假设多线程竞争是互相错开的,不会发生线程阻塞,呢么上下文切换就是多余的
  • 第一个特点:采用了CAS操作加锁和解锁,由于轻量级锁的锁记录(Lock Record)是存放在对象头和线程空间里的,因此加锁和解锁不需要上下文切换,性能消耗较小
  • 第二个特点:一旦发生多线程竞争,首先基于“自旋锁”思想,自旋CPU循环等待一段时间,不会发生上下文切换,如果还是无法获得锁,就将锁升级为重量级锁
  1. 偏向锁:基于轻量级锁进行了优化(减少多次的加锁和解锁,提高了性能),它假设整个过程只有一个线程获得锁,呢么多次的加锁和解锁就是多余的
  • 特点:在第一次获得锁之后不会释放锁,它会一直持有锁,后续进入锁时只需检查一下锁状态和偏向线程ID是否为自己,从而省去了多次的加锁和解锁

1.偏向锁

获取锁:

  1. 检测对象头的Mark Word是否为可偏向状态(即是否为偏向锁1,锁标志位是否为01),如果不是,尝试竞争锁:尝试CAS操作将Mark Word的线程ID设置为当前线程ID,以表示线程获得锁,如果失败说明锁已被占用
  2. 若为可偏向状态,则检查线程ID是否为当前线程ID,如果是则表示当前线程已经持有锁(锁的可重入),否则说明锁已被占用
  3. 如果锁已被占用,只能撤销偏向锁为无锁状态或轻量级锁

释放锁:(偏向锁使用了一种等到竞争出现才释放锁的机制,线程是不会主动释放偏向锁的,只有当其他线程竞争偏向锁时,持有偏向锁的线程才会释放锁)

  1. 偏向锁的撤销需要等待全局安全点(在这个时间点没有正在执行的字节码),暂停拥有偏向锁的线程,检查持有偏向锁的线程是否还活着
  2. 如果线程挂了,则将对象头设置成无锁状态;如果线程仍然活着,则将对象头设置为轻量级锁(锁的升级),最终轻量级锁一定会被释放

2.轻量级锁

获取锁:

  1. 检测对象头的Mark Word是否为轻量级锁(锁标志位为00),如果不是,尝试竞争锁:JVM首先在当前线程的栈帧中建立一个锁记录(Lock Record),用于备份存储对象头的Mark Word(官方把这份拷贝加了一个Displaced前缀,称为Displaced Mark Word),然后JVM尝试CAS操作将Mark Word更新为指向Lock Record的指针,以表示线程获得锁,如果失败说明锁已被占用
  2. 若为轻量级锁,判断对象头的Mark Word是否指向当前线程的栈帧的Lock Record,如果是则表示当前线程已经持有锁(锁的可重入),否则说明锁已被占用
  3. 如果锁已被占用,当前线程便尝试自旋CPU来获取锁,自旋一定次数后轻量级锁会膨胀为重量级锁(锁标志位变成10),线程进入阻塞

释放锁:

  1. 尝试CAS操作将Displaced Mark Word中替换回对象头,如果成功,说明轻量级锁释放成功
  2. 如果CAS操作失败,说明存在锁竞争,锁已经膨胀成重量级锁,需要在释放锁的同时唤醒那些被挂起的线程

3.重量级锁

重量级锁依赖于底层操作系统的Mutex Lock,所有线程都会被阻塞住,线程之间的切换需要从用户态到内核态,切换成本非常高。

总结:锁的优缺点对比

私信头条号,发送:“资料”,获取更多“秘制” 精品学习资料

如有收获,请帮忙转发,您的鼓励是作者最大的动力,谢谢!

轻量级锁_Java高级架构师-Java锁的升级策略 偏向锁 轻量级锁 重量级锁相关推荐

  1. requestmapping注解作用_Java高级架构师-Spring 注解编程之注解属性别名与覆盖

    欢迎关注头条号:Java小野猫 注解属性方法 在进入了解 Spring 注解属性功能之前,我们先看一个正常 Java 注解. 在注解中,属性方法与其他类/接口方法写法类似,但是存在一些区别. 注解属性 ...

  2. Java高级架构师之路核心知识整理

    小编整理出一篇Java高级架构师之路的核心知识,同时也是面试时面试官必问的知识点,篇章也是包括了很多知识点,其中包括了有基础知识.Java集合.JVM.多线程并发.spring原理.微服务.Netty ...

  3. 高级架构师,精通JAVA/高并发/微服务/分布式/中间件

    JAVA高级架构师专栏 大纲介绍 Java基础复习 单点系统 Springboot框架应用 页面开发模版引擎 Java核心基础 JVM调优 高并发优化 Spring.Mybatis.Springboo ...

  4. java里面如何加入高级的东西_如何成为一名Java高级架构师

    近些年来互联网快速发展,现阶段的数据量和高并发的诉求,引起了不少传统的技术人员的力不从心,企业愈发关注到了系统架构的重要性,既需要掌控整体又需要洞悉局部瓶颈并依据具体的业务场景给出解决方案的领导型人物 ...

  5. 阿里 P8 Java高级架构师,都需要掌握哪些技术栈?

    大家都知道,阿里P8高级技术专家,基本上是一线技术人能达到的最高职级,也是很多程序员追求的目标.达到平均年入百万的P8 Java高级架构师级别,不仅要具备优秀的编程能力和系统设计能力,在技术视野和业务 ...

  6. 廖雪峰Java高级架构师第一期

    廖雪峰Java高级架构师第一期

  7. 强推面试前必刷:Alibaba 内部 Java 高级架构师

    最近有很多同学已经开始准备下半年的跳槽面试了,不得不说还是要给这些同学竖一个大拇指的,看来这些同学都是未雨绸缪的行家呀!老师今天就为大家分享一份 Alibaba 内部 Java 高级架构师面试题的总结 ...

  8. 一线大厂对于Java高级架构师有怎样的要求?成为一名年薪80万需要具备什么能力

    艾编程:成为一名年薪80万以上的架构师到底应具备怎样的能力 艾编程:成为一名年薪80万以上的架构师到底应该具备怎样的能力 一名优秀的架构师,必须要具备六项能力,到底是什么能力,当掌握了这个能力之后会有 ...

  9. 【架构师教程】廖雪峰大牛的Java高级架构师教程

    可以说,Java是现阶段中国互联网公司中,覆盖度最广的研发语言,掌握了Java技术体系,不管在成熟的大公司,快速发展的公司,还是创业阶段的公司,都能有立足之地. 成为Java架构师,需要掌握哪些技能呢 ...

最新文章

  1. 如何把Spring Boot的Jar包做成exe?超详细教程来了!
  2. 11月Android笔记
  3. MySQL 8.0 技术详解
  4. DL之LSTM之MvP:基于TF利用LSTM基于DIY时间训练csv文件数据预测后100个数据(多值预测)状态
  5. Hibernate-HQL
  6. 神奇的计算器dc和bc
  7. tim怎么设置检测到新版本自动安装 tim安全自动更新的开启方法
  8. java poi设置单元格格式为数值_Excel 文本转数值的方法——我找的好苦啊
  9. win11快捷键失效怎么办 windows11快捷键失效的解决方法
  10. 【Django 2021年最新版教程30】django项目部署到华为云(nginx uWSGI mysql方式)
  11. undefined reference to `crypto_get_random'
  12. android4.0.3校准屏幕和隐藏statusbar
  13. BIM学习笔记(一)
  14. Win11怎么重装显卡驱动程序?Win11显卡驱动怎么卸载重装?
  15. Apache FOP2.6 SVG导出PDF配置,解决中文字体变成####
  16. 红米手机停在机器人这里_红米开不了机,开机画面一直显示一个米兔机器人在修理的画面...
  17. HTML页面转PDF导出加水印并解决字被截断的问题
  18. 剩余电流动作继电器的应用探讨
  19. PAT 1108 Finding Average
  20. 云服务赛道竞速,谁是云背后的力量?

热门文章

  1. 51Nod-1019 逆序数【逆序偶+归并排序】
  2. HDU2602 Bone Collector【0/1背包+DP】
  3. 解决复杂问题的思路 —— 从简单到复杂
  4. latex 基本用法(五)
  5. goto 语句和标号
  6. 【笔试/面试】—— 数学找规律题
  7. java反射获取泛型_如何通过Java反射获取泛型类型信息
  8. 量化感知训练_一文速览EMNLP 2020中的Transformer量化论文
  9. python称号_C 语言荣获 2019 年度最佳编程语言称号
  10. python自动化办公真的好用吗-用 Python 自动化办公能做到哪些有趣或有用的事情?...