java中每个对象都可作为锁,锁有四种级别,按照量级从轻到重分为:无锁、偏向锁、轻量级锁、重量级锁。每个对象一开始都是无锁的,随着线程间争夺锁,越激烈,锁的级别越高,并且锁只能升级不能降级。

一、java对象头

锁的实现机制与java对象头息息相关,锁的所有信息,都记录在java的对象头中。用2字(32位JVM中1字=32bit=4baye)存储对象头,如果是数组类型使用3字存储(还需存储数组长度)。对象头中记录了hash值、GC年龄、锁的状态、线程拥有者、类元数据的指针。

二、偏向锁

在实际应用运行过程中发现,“锁总是同一个线程持有,很少发生竞争”,也就是说锁总是被第一个占用他的线程拥有,这个线程就是锁的偏向线程。

那么只需要在锁第一次被拥有的时候,记录下偏向线程ID。这样偏向线程就一直持有着锁,直到竞争发生才释放锁。以后每次同步,检查锁的偏向线程ID与当前线程ID是否一致,如果一致直接进入同步,退出同步也,无需每次加锁解锁都去CAS更新对象头,如果不一致意味着发生了竞争,锁已经不是总是偏向于同一个线程了,这时候需要锁膨胀为轻量级锁,才能保证线程间公平竞争锁。

1.加锁

偏向锁加锁发生在偏向线程第一次进入同步块时,CAS原子操作尝试更新对象的Mark Word(偏向锁标志位为"1",记录偏向线程的ID)。

2.撤销偏向锁

当有另一个线程来竞争锁的时候,就不能再使用偏向锁了,要膨胀为轻量级锁。

竞争线程尝试CAS更新对象头失败,会等待到全局安全点(此时不会执行任何代码)撤销偏向锁。

三、轻量级锁

轻量锁与偏向锁不同的是:

轻量级锁每次退出同步块都需要释放锁,而偏向锁是在竞争发生时才释放锁

每次进入退出同步块都需要CAS更新对象头

争夺轻量级锁失败时,自旋尝试抢占锁

可以看到轻量锁适合在竞争情况下使用,其自旋锁可以保证响应速度快,但自旋操作会占用CPU,所以一些计算时间长的操作不适合使用轻量级锁。

1.加锁

加锁过程和偏向锁加锁差不多,也是CAS修改对象头,只是修改的内容不同。

在MarkWord中保存当前线程的指针

修改锁标识位为“00”

采用CAS操作的原因是,不想在加锁解锁上再加同步

如果对象处于无锁状态(偏向锁标志位为"0",锁标志位为"01"),会在线程的栈中开辟个锁记录空间(Lock Record),将Mark Word拷贝一份到Lock Record中,称为Displaced Mark Word,在Lock Record中保存对象头的指针(owner)。

接下来CAS更新MarkWord,将MarkWord指向当前线程,owner指向MarkWord,如果失败了,则意味着出现了另一个线程竞争锁,此时需要锁膨胀为轻量级锁。

2.解锁

用CAS操作锁置为无锁状态(偏向锁位为"0",锁标识位为"01"),若CAS操作失败则是出现了竞争,锁已膨胀为重量级锁了,此时需要释放锁(持有重量级锁线程的指针位为"0",锁标识位为"10")并唤醒重量锁的线程。

3.膨胀为重量级锁

当竞争线程尝试占用轻量级锁失败多次之后,轻量级锁就会膨胀为重量级锁,重量级线程指针指向竞争线程,竞争线程也会阻塞,等待轻量级线程释放锁后唤醒他。

三、重量级锁

重量级锁的加锁、解锁过程和轻量级锁差不多,区别是:竞争失败后,线程阻塞,释放锁后,唤醒阻塞的线程,不使用自旋锁,不会那么消耗CPU,所以重量级锁适合用在同步块执行时间长的情况下。

四、参考

java 偏向锁 重偏向_锁原理:偏向锁、轻量锁、重量锁相关推荐

  1. 并发系列三:证明分代年龄、无锁、偏向锁、轻量锁、重(chong)偏向、重(chong)轻量、重量锁

    前言 上篇文章咱们了解了synchronized关键字的常见用法.对象头以及证明了一个对象在无锁状态下的对象头markwork部分的前56位存储的是hashcode.接下来,咱们继续来根据对象头分别证 ...

  2. java lock可重入_一文彻底理解ReentrantLock可重入锁的使用

    java除了使用关键字synchronized外,还可以使用ReentrantLock实现独占锁的功能.而且ReentrantLock相比synchronized而言功能更加丰富,使用起来更为灵活,也 ...

  3. 整个电脑键盘被锁住了_希沃智能大屏按键说明,锁屏组合键你知道吗?小心被熊孩子锁住了...

    教室里安装了希沃智能大屏,可以触摸.可以书写.演示课件等,功能非常强大,老师使用时非常方便.#希沃# #白板5# #智能大屏# 今天给大家介绍一下主机上的按键使用方法. 我们认识一下这几个按键,请看图 ...

  4. 一键清除苹果锁屏密码_极品苹果手机解锁软件ios解锁大师苹果手机锁屏密码忘了不用愁...

    苹果手机因其得天独厚操作系统的优势使得即便安卓系统发展到现在的版本以及硬件存储参数达到了惊人的8GB/128GB.10GB/256GB依然没有完全撼动苹果IOS系统的霸主地位,所以苹果Iphone手机 ...

  5. java音乐播放器文库_微机原理课程设计报告——音乐播放器.doc

    微机原理课程设计报告--音乐播放器.doc 微机 应用系统 课程设计报告 题 目 电子音乐播放器 专业班级 电子信息科学与技术 1001 班 设计学生 完成时间 2012 年 6 月 27 日 湖南文 ...

  6. java实现缓存方式_【Java】【器篇】【缓存】一个轻量的缓存实现方式

    一.引言来 系统中时常要对外暴露一些特殊数据,这些数据存储于关系型数据库中,且显著的特征是: 数据请求频繁 数据变动很小 数据体量略大 数据请求频繁,说明要频繁的与数据库产生交互,占用与数据库的会话资 ...

  7. 买个云服务器有啥用_如何用阿里云轻量应用服务器配置一个WordPress网站?

    轻量应用服务器是面向单机应用场景的新一代计算服务,提供精品应用一键部署,支持一站式的域名.网站.安全.运维.应用管理等服务,极大优化搭建简单应用的体验,降低了入门级用户使用云计算产品的门槛. 那么,我 ...

  8. java同步锁synchronized_synchronized、锁、多线程同步的原理是咋样的?

    先综述个结论:一般说的synchronized用来做多线程同步功能,其实synchronized只是提供多线程互斥,而对象的wait()和notify()方法才提供线程的同步功能.一般说synchro ...

  9. syncnized锁重入

    分享链接:synchronized锁重入_给自己一个前行的动力-CSDN博客 笔记:在继承环境中子类可调用父类的同步方法. 在继承关系中,同步是不可继承的.

  10. java都要caps标点_第 1 章 管理 Java CAPS 用户

    第 1 章 管理 Java CAPS 用户 在此处列出的主题提供了有关如何管理 Sun JavaTM Composite Application Platform Suite (Java CAPS) ...

最新文章

  1. 如果某路由器到达目的网络有三种方式:通过RIP;通过静态路由;通过默认路由,那么路由器会根据哪种方式进行转发数据包?( )
  2. skyline三维模型规格
  3. Longest Common Prefix
  4. 2020年AI领域有哪些让人惊艳的研究?
  5. 自定义 View 功能上线,你的小程序可以更多变
  6. 【蓝桥杯Java_C组·从零开始卷】第八节、集合——list详解(ArrayList、 LinkedList 和 Vector之间的区别)
  7. python编译为机器码_Python FAQ2-python代码编译问题
  8. 深入了解HashMap
  9. 《精解 Windows 10》——2.10 触摸手势
  10. opencv 实现图像形态学操作 膨胀和腐蚀 开闭运算 形态学梯度 顶帽和黑帽
  11. 火力发电计算机控制参数详细过程,火力发电过程
  12. 将图片转换成url链接
  13. Typora怎么将文本居中
  14. sko.GA实现遗传算法的源码解析
  15. Android 自启项管理器工具
  16. 用通俗易懂的大白话彻底搞明白mysql的数据类型以及mysql中的int(11),这个11到底是啥?
  17. Mysql| order by 排序检索数据(ASC,DESC)
  18. Android 透明状态栏
  19. 2022汽车驾驶员(高级)考试模拟100题及在线模拟考试
  20. chome浏览器中,console报错却不显示错误

热门文章

  1. 10-3国际黄金最新行情趋势分析及期货原油价格涨跌操作指导
  2. Microsoft Office PowerPoint 2007 文字重叠
  3. c语言编写重装机兵1,《C语言》2012年春学期在线作业(四).doc
  4. Python一日一练07----冒泡排序
  5. linux查看操作系统版本、内存信息
  6. 字符串 压缩 java_简单的java字符串压缩(原创)
  7. 内容为王、游戏出海、技术变革,2020年游戏行业有哪些新趋势?
  8. Matlab强化学习——部署策略
  9. 可持续产品申请grsTC吊牌有哪些要求?
  10. TensorFlow与NLP(词向量:skip-gram)