Java SE 1.6 为了减少获得锁和释放锁带来的性能消耗,引入了 “偏向锁” 和 “轻量级锁”:锁一共有 4 种状态,级别从低到高依次是:无锁状态、偏向锁状态、轻量级锁状态和重量级锁状态。锁可以升级但不能降级。

偏向锁:大多数情况下,锁不仅不存在多线程竞争,而且总是由同一线程多次获得,为了让线程获得锁的代价更低而引入了偏向锁。当一个线程访问同步块并获取锁时,会在对象头和栈帧中记录存储锁偏向的线程ID,以后该线程在进入同步块时先判断对象头的Mark Word里是否存储着指向当前线程的偏向锁,如果存在就直接获取锁。(简单来说就是markword 记录这个线程ID (偏向锁))

自旋锁:当其他线程尝试竞争偏向锁时,锁升级为自旋锁。线程在执行同步块之前,JVM会先在当前线程的栈帧中创建用于存储锁记录的空间,并将对象头中的MarkWord替换为指向锁记录的指针。如果成功,当前线程获得锁,如果失败,标识其他线程竞争锁,当前线程便尝试使用自旋来获取锁。(简单点来说就是线程如果争用偏向锁时,则升级为自旋锁)

重量级锁:锁在原地循环等待的时候,是会消耗CPU资源的。所以自旋必须要有一定的条件控制,否则如果一个线程执行同步代码块的时间很长,那么等待锁的线程会不断的循环反而会消耗CPU资源。默认情况下锁自旋的次数是10 次,可以使用-XX:PreBlockSpin参数来设置自旋锁等待的次数。10次后如果还没获取锁,则升级为重量级锁。(简单说:自旋锁自旋10次,升级为重量级锁)
tip:
markWord:存储了对象的hashCode、GC信息、锁信息三部分

Synchronized锁升级过程相关推荐

  1. synchronized锁升级过程及其实现原理

    本文链接:https://blog.csdn.net/wangyy130/article/details/106495180 问:为什么会有锁升级的过程呢 答:在java6以前synchronized ...

  2. synchronized 锁升级过程

    synchronized 锁升级过程就是其优化的核心:偏向锁 -> 轻量级锁 -> 重量级锁 class Test{private static final Object object = ...

  3. synchronized锁升级过程详解

    32位: 64位: 无锁: 1001001110000101111101010101110 HashCode:1237514926 十进制:1237514926 二进制:0100100 1100001 ...

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

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

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

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

  6. 存储过程没有执行完后没有释放锁_面试必问---synchronized实现原理及锁升级过程你懂吗?...

    synchronized实现原理及锁升级过程 前言: synchronized是Java内置的机制,是JVM层面的,而Lock则是接口,是JDK层面的 尽管最初synchronized的性能效率比较差 ...

  7. 在c#中用mutex类实现线程的互斥_面试官经常问的synchronized实现原理和锁升级过程,你真的了解吗...

    本篇文章主要从字节码和JVM底层来分析synchronized实现原理和锁升级过程,其中涉及到了简单认识字节码.对象内部结构以及ObjectMonitor等知识点. 阅读本文之前,如果大家对synch ...

  8. Synchronized详细介绍之锁升级过程

    Synchronized详细介绍之锁升级过程 前言 线程与进程的区别 进程 线程 区别 协程 JVM线程调度原理 JVM线程调用过程 JAVA线程与内核线程的关系 源码分析 线程状态 Synchron ...

  9. 谈谈JVM内部锁升级过程

    简介: 对象在内存中的内存布局是什么样的?如何描述synchronized和ReentrantLock的底层实现和重入的底层原理?为什么AQS底层是CAS+volatile?锁的四种状态和锁升级过程应 ...

最新文章

  1. 使用system语句出现不明确问题
  2. opencv3.4.1 vs2017 鼠标停在 Mat 上 vs卡死
  3. oracle rodo 查看大小,Checkpoint not complete故障
  4. python 获取子目录下的所有文件的路径
  5. 初次转化max模型为3D Tiles失败、cesium加载一个obj格式的3D 机房模型
  6. 计算机视觉与深度学习 | SLAM综述(自主移动机器人同时定位与地图创建)
  7. 豆瓣、唱吧、爱回收等106款应用被工信部下架
  8. spring session spring:session:sessions:expires 源码跟踪
  9. Struts,Spring 等开源项目svn 地址
  10. C# 程序中使用 SQLite 数据库
  11. 图像特征原理--HOG特征
  12. 局域网服务器ie浏览器文件传输慢,局域网内打开IE浏览器很久才显示主页,慢的原因及解决方法...
  13. 杭漂多年是时候画个句号呢
  14. uva 1645 count
  15. 2019年 十款Mac上必备的实用软件列表
  16. bzoj1720[Usaco2006 Jan]Corral the Cows 奶牛围栏
  17. ElasticSearch7.10配置Search-Guard之配置用户
  18. 推荐几本提高Java代码规范、可读性、健壮性和可维护性的基本经典图
  19. 软件跟踪调试破解心得
  20. 「构生态·建未来 」2019软件绿色联盟开发者大会售票开启

热门文章

  1. pika.exceptions.ChannelWrongStateError: Channel is closed.
  2. 【Unity面试】 Lua语言基础核心 | 面试真题 | 全面总结 | 建议收藏
  3. 如何用计算机求极限,计算机的极限与并行计算
  4. 07年钢材市场发展态势权威预测
  5. C语言计算字符串长度
  6. QSortFilterProxyModel实现排序、过滤
  7. Java程序员面试,基础真的很重要
  8. 手机无线遥控器,让手机变成无线鼠标+无线键盘!
  9. 蹭clubhouse热度加大IPO步伐,年轻的TT语音靠Z世代能掘金多少?
  10. 3ds Max小白入门小案例|FFD你是我的小苹果