1.  偏向锁

当一个锁被线程获取后,这个线程便进入偏向模式,当线程再次请求这个锁时,无需再进行相关的同步操作,从而节省了时间。如果在此之前,其他线程进行了锁请求,则原线程退出偏向模式。当对象处于偏向模式时,对象头的Mark Word会记录获取锁的线程

JavaThread*  |  epoch  | age  | 1  | 01

这样,当该线程再次尝试获取该对象锁时,通过Mark Word的线程信息就可以判断当前线程是否持有偏向锁。

但是注意: 偏向锁在竞争激烈的场合没有太强的优化效果,因为大量的竞争会导致持有锁的线程不停的切换,锁也很难一直保持在偏向模式,此时,使用偏向锁不仅不能得到性能优化,反而可能降低性能。因为,在竞争激烈的场合,可以尝试使用-XX:-UseBiasedLocking参数禁用偏向锁

2. 轻量级锁

如果尝试申请偏向锁失败,则Java虚拟机会让线程申请轻量级锁。使用的CAS操作,尝试将BasicLock的地址复制到对象头的Mark Word,如果复制成功,那么加锁成功,否则认为加锁失败。如果加锁失败,轻量级锁就有可能被膨胀为重量级锁。

轻量级锁在虚拟机内部,使用一个称为BasicObjectLock的对象实现,这个对象内部由一个BasicLock对象和一个持有该锁的Java对象指针组成。BasicObjectLock对象放置在Java栈的栈帧中。当要判断某一线程是否持有该对象锁时,也只需简单的判断对象头的指针是否在当前线程的栈地址范围内即可

3.  重量级锁

4. 自旋锁

自旋锁可以使线程在没有取得锁时不被挂起,转而去执行一个空循环(所谓的自旋),在若干个空循环后,线程如果可以获得锁,则继续执行。若线程仍然不能获得锁,才会被挂起。对于那些锁竞争不是很激烈,锁占用时间很短的并发线程,具有一定的意义,但是对于锁紧张激烈,单线程锁占用时间长的并发程序,自旋锁在自旋等待后,往往依然无法获得对应的锁,不仅浪费了时间,最终还是会被挂起,浪费了资源

5. 锁消除

锁消除是Java虚拟机在JIT编译时,通过对运行上下文的扫描,去除不可能存在共享资源竞争的锁。从而消除毫无意义的请求锁时间。

这主要是针对比如StringBuffer,Vector一些线程安全的工具类使用在了本身不存在竞争的场合。虚拟机可以在运行时,基于逃逸分析技术,捕获到这些不可能存在竞争却又申请锁的代码段,并消除这些不必要的锁,提供系统性能。

Java虚拟机层面的几种锁相关推荐

  1. JVM笔记 - Java 虚拟机关于 Synchronized 实现以及锁实现的总结

    本文是我在阅读 <深入理解Java虚拟机-第三版>和 极客时间 郑宇迪对于JVM的剖析后做的总结,如有不妥,不明白的地方,欢迎斧正 下面是一张比较经典的 Java 虚拟机锁实现流程图,不了 ...

  2. 在Java虚拟机上班是一种怎样的体验?

    来源 | 编程技术宇宙 责编| Carol 封图 | CSDN 下载自视觉中国 本文用知乎体的风格简单介绍了JVM中几个内置线程的工作,希望对大家学习JVM有一点帮助. 匿名用户 JVM老鸟 228 ...

  3. 在 Java 虚拟机上班是一种怎样的体验?

    来源 | 编程技术宇宙 责编| Carol 封图 | CSDN 下载自视觉中国 本文用知乎体的风格简单介绍了JVM中几个内置线程的工作,希望对大家学习JVM有一点帮助. 匿名用户 JVM老鸟 228 ...

  4. 24张图带你彻底理解Java中的21种锁

    本篇主要内容如下: 本篇主要内容 本篇文章已收纳到我的Java在线文档. Github 我的SpringCloud实战项目持续更新中 帮你总结好的锁: 序号 锁名称 应用 1 乐观锁 CAS 2 悲观 ...

  5. java中怎么判断一段代码时线程安全还是非线程安全_24张图带你彻底理解Java中的21种锁...

    (给ImportNew加星标,提高Java技能) 转自:悟空聊架 本篇主要内容如下: 本篇文章已收纳到我的 Java 在线文档. Github.我的 SpringCloud 实战项目持续更新中. 帮你 ...

  6. 多图带你彻底理解Java中的21种锁!

    作者 | 悟空聊架构 来源 | 悟空聊架构(ID:PassJava666) 本篇主要内容如下: 本篇主要内容 本篇文章已收纳到我的Java在线文档. Github 我的SpringCloud实战项目持 ...

  7. Java中的21种锁

    本篇主要内容如下: 本篇主要内容 本篇文章已收纳到我的Java在线文档. Github 我的SpringCloud实战项目持续更新中 帮你总结好的锁: 序号锁名称应用1乐观锁CAS2悲观锁synchr ...

  8. 《深入理解Java虚拟机》知识点目录

    深入理解Java虚拟机 第二章 Java内存区域与内存溢出异常 2.2 运行时数据区域 p42 Java内存区域划分概述 p43 程序计数器 p43 程序计数器是唯一一个不会存在OOM的内存区域 p4 ...

  9. java虚拟机第三版学习

    java 编译执行流程 Java 源文件->编译器->字节码文件->JVM->机器码 Java 内存区域与内存溢出异常 [外链图片转存失败,源站可能有防盗链机制,建议将图片保存 ...

最新文章

  1. 《评人工智能如何走向新阶段》后记(深谈人工智能发展前沿)
  2. 分类问题的评估指标(Evaluation for Classifier)
  3. 扫地机器人“离家出走”的真实原因找到了:差个自动驾驶算法
  4. MongoDB学习之路(三)
  5. 一个产品新人的年终总结 PMcaff | 分享
  6. devstack部署openstack流程与相关问题的记录(ubuntu 16.04)
  7. MyBatis 实际使用案例-核心对象的生命周期
  8. linux复制文件通信方式,Linux分布式文件拷贝
  9. Python之NumPy(axis=0 与axis=1)区分
  10. c 通过jni调用java_使用c通过jni调用java
  11. HTML 基本知识点(草稿)
  12. android在程序中打开另一个程序
  13. XXE漏洞 解决方案(JAVA版本)
  14. node 升级_那些修改node_modules的骚操作
  15. activiti5 工作流
  16. 齐齐哈尔大学考研计算机专业,齐齐哈尔大学(专业学位)计算机技术研究生考试科目和考研参考书目...
  17. 张驰课堂:六西格玛中的Minitab软件,到底有多重要
  18. web3d-手机产品展示_onePlus6
  19. 会java需要多久能学会python_java好学吗?零基础学java要多久?
  20. 计算机学院2022级新生邀请赛(二)

热门文章

  1. jquery项目中一些常用方法
  2. Machine Learning、Date Mining、IRNLP 会议期刊论文推荐
  3. 安装grunt-browser-sync时报错:“未能加载Visual C++ 组件 “VCBuild.exe”
  4. ajax get post
  5. [linux驱动]proc学习笔记(一)
  6. Android_自定义控件样式
  7. C# 二进制数据、图片存入、读出 sql server 数据库
  8. 使用组合改进软件测试用例的生成2
  9. 【Java】MapReduce 程序五步走的思想详细描述
  10. Logstash配置语法