偏向锁

当锁对象第一次被线程获取时,虚拟机会把对象头的锁状态标志设置为01(即偏向状态),同时,使用CAS操作把获取到这个锁的线程的ID记录在对象头的mark word中。如果这个CAS操作成功,那么,以后持有这个偏向锁的线程在进入这个锁相关的同步块的时候都不需要进行同步,只需要测试对象头的mark word中是否存储着当前线程的ID。若测试成功,则直接进入同步块。若测试失败,则需要测试mark word中锁状态标志位是否为01。若不为01(即表示对象此时处于轻量级/重量级锁状态),则使用CAS操作竞争锁。若为01(即01表示对象此时处于已偏向状态),则尝试使用CAS将对象头的偏向线程ID改为当前线程ID。

此处,着重讨论mark word中锁状态标志位为01的情况:由于偏向锁采用了一种等到竞争出现才会释放锁的机制(即偏向锁不会主动释放),所以当前线程就会知道锁对象此时(可能)处于竞争状态了。(在全局安全点――没有正在执行的字节码)JVM会首先暂停持有偏向锁的线程,然后检查拥有偏向锁的线程是否存活。若没有存活,则将对象头设置为无锁状态并重新偏向。若线程仍然存活,则持有偏向锁的栈会被执行,遍历偏向锁的锁记录、栈中的锁记录以及对象头的mark word(就是检查持有偏向锁的线程是否还需要持有偏向锁)。若检查结果表明该持有偏向锁的线程不需要持有偏向锁了,则将锁对象恢复为无锁状态并重新偏向。否则表明此时锁对象真的处于竞争状态了,那么偏向锁就会被升级成轻量级锁。

注意:当锁对象开启偏向时mark word中有一个比特位将会被置为1,所以偏向状态和未锁定状态除了其他字段的区别外,在这个比特位上也有区别。

轻量级锁

在代码进入同步块的时候,如果此同步对象没有被锁定,即锁标志位为01,那么JVM会先在当前线程的栈帧中创建一个存储锁对象头中Mark Word拷贝的空间(称为锁记录),同时将锁对象头中的Mark Word复制到锁记录中并加上Displaced前缀(Displaced Mark Word)。

然后,JVM使用CAS将锁对象头中的Mark Word更新为指向锁记录的指针。若更新成功,则当前线程便持有了该对象的锁,并且锁对象的标志位变为00(表示此对象处于轻量级锁定状态)。若更新操作失败了,虚拟机会首先检查对象的Mark Word是否指向当前线程的栈帧,如果是则表明当前线程已经拥有了这个对象的锁,可以直接进入同步块继续执行。如果不是,则当前线程进入自旋,(个人见解,不当之处欢迎指正)则会有两种情况会膨胀为重量级锁: 当前线程自旋期间,有第三个线程来获取锁,则膨胀为重量级锁,标志位被当前线程置为10,Mark Word中存储的就是指向重量级锁(互斥量)的指针,当前线程和第三个线程进入阻塞状态;

当前线程自旋超过限定次数,则膨胀为重量级锁,标志位被当前线程置为10,Mark Word中存储的就是指向重量级锁(互斥量)的指针,当前线程进入阻塞状态。

如果当前线程自旋的时候没有发生上面两种情况,那么最终它将获得锁对象的轻量级锁。

轻量级锁的解锁也是通过CAS操作进行的,如果对象的Mark Word仍指向线程的锁记录,那么就用CAS把对象当前的Mark Word和线程中的Displaced Mark Word替换回来。若替换成功,则整个同步过程完成,若替换失败,则表明有其他线程竞争过锁,就要在释放锁的同时唤醒被挂起的线程。

参考文献:

1、《深入理解Java虚拟机》,周志明著;

2、《Java并发编程的艺术》,方腾飞,魏鹏,程晓明著;

java 偏向锁 怎么用_Java锁升级、偏向锁、轻量级锁相关推荐

  1. java的尝试性问题_Java并发编程实战 03互斥锁 解决原子性问题

    文章系列 摘要 在上一篇文章02Java如何解决可见性和有序性问题当中,我们解决了可见性和有序性的问题,那么还有一个原子性问题咱们还没解决.在第一篇文章01并发编程的Bug源头当中,讲到了把一个或者多 ...

  2. java 多线程 串行 加锁_Java多线程(2)线程锁

    多线程访问同一个资源进行读写操作,就很容易出一些问题(比如我们常见的读者写者,生产者消费者模型)所以我们会选择对他们设置信号量或者加锁,来限制同一个时刻只有一个线程对某个对象进行操作. 多线程是一个蛮 ...

  3. 轻量级锁_Java高级架构师-Java锁的升级策略 偏向锁 轻量级锁 重量级锁

    欢迎关注头条号:Java小野猫 这三种锁是指锁的状态,并且是专门针对Synchronized关键字.JDK 1.6 为了减少"重量级锁"的性能消耗,引入了"偏向锁&quo ...

  4. java轻量级和重量级_Java 偏向锁、轻量级锁和重量级锁

    前言 最开始听到偏向锁.轻量级锁和重量级锁的概念的时候,我还以为是 Java 中提供了相应的类库来实现的,结果了解后才发现, 这三个原来是虚拟机底层对 synchronized 代码块的不同加锁方式. ...

  5. java——无锁、偏向锁、轻量级锁、重量级锁的synchronize锁升级笔记

    本章所需基础知识: 懂得多线程和锁的基础知识就行 或者看完我上一篇的<java多进程和多线程简单复习(不涉及原理)>就可以了 如果没基础建议别看 推荐视频: B站马士兵老师的视频:无锁.偏 ...

  6. java 锁_Java之线程并发的各种锁、锁、锁

    因为两周没更新了... 也不是懒,这两周确实有些忙,赶项目进度赶的不亦乐乎... 终于赶在工期前,可以进入内测了,我也有了些时间,可以更新啦... 线程并发锁是很常见的问题,而且在Java中锁的类型. ...

  7. Java如何避免重量级锁,Java 中锁是如何一步步膨胀的(偏向锁、轻量级锁、重量级锁)...

    文章目录 重量级锁(Mutex Lock) 偏向锁(比较 ThreadID) 偏向锁获取过程 偏向锁的释放 轻量级锁(自旋) 轻量级锁的加锁过程 轻量级锁的释放 总结 重量级锁(Mutex Lock) ...

  8. java char占用多少字节_Java虚拟机:Java对象大小、对象内存布局及锁状态变化

    一个对象占多少字节? 关于对象的大小,对于C/C++来说,都是有sizeof函数可以直接获取的,但是Java似乎没有这样的方法.不过还好,在JDK1.5之后引入了Instrumentation类,这个 ...

  9. Synchronized锁升级:无锁-> 偏向锁 -> 轻量级锁 -> 重量级锁

    一. 概述 1. Synchronized锁升级的原因 用锁能够实现数据的安全性,但是会带来性能下降.无锁能够基于线程并行提升程序性能,但是会带来安全性下降. 2. Synchronized锁升级的过 ...

  10. 锁升级过程(无锁、偏向锁、轻量级锁、重量级锁)

    文章目录 Synchronized锁升级的背景 Synchronized的性能变化 Java5之前,用户态和内核态之间的切换 为什么每个对象都可以称为一把锁? Java6开始优化Synchronize ...

最新文章

  1. java判断是否为数组_JS如何判断是否是数组?
  2. ASP.NET MVC 2 验证
  3. php如何读取多个url文件,如何从PHP中的URL获取具有相同名称的多个参数
  4. 160 - 37 CyberBlade.1
  5. java输出a-z_有1-26个数字和a-z字母,用Java多线程实现先输出2和数字再输出2个字
  6. 外设驱动库开发笔记21:BME680环境传感器驱动
  7. 2021抖音口腔护理行业洞察报告
  8. php image 转 data uri 图片 (Image Data URIs with PHP)
  9. BiLSTM+CRF医学病例命名实体识别项目
  10. java网络通信技术示例:简单的聊天小程序
  11. 利用条形码生成器在Word 2013中轻松制作条形码的方法
  12. 【安装Oracle 12.2.0.1补丁】Oracle Database SAP Bundle Patch 12.2.0.1.220118 - 202202
  13. 纪念谢尔盖·科尔塔科夫
  14. 微信小程序利用腾讯云IM发送语音 + 图片
  15. width mismatch when connecting input pin '/processing system 7_0/irq_f2p'(2) to net 'xlconcat_0_dout
  16. 主成分分析、因子分析及其有关的数学基础
  17. Tuxera NTFS2022mac电脑无法读取写入移动硬盘如何解决?
  18. 逆向---02.je jmp jnz 、OD调试
  19. OMAP DEV RESOURCE
  20. PPT如何带走自己的字体?

热门文章

  1. 用Keil-MDK开发TQ2440裸机程序入门教程——LED流水灯实现
  2. SharePoint 2010中的内容类型集线器 - 内容类型发布与订阅
  3. ASP.NET数据库编程入门
  4. spring学习笔记04-IOC常用注解(一)
  5. SVM支持向量机-手写笔记(超详细:拉格朗日乘数法、KKT条件、对偶性质、最优化、合页损失、核函数...)
  6. 【剑指offer】面试题54:二叉搜索树的第k大节点(java)
  7. Leetcode--76. 最小覆盖子串
  8. Leetcode--174. 地下城游戏
  9. 留言板asp mysql_ASP简单入门(制作一个简单的留言板 )
  10. php layui table,Layui table组件相关介绍