世界上不止有黑白两色,黑与白之间还是灰色的地带。

在成人的世界里,大多数人喜欢非黑即白的观点来看待一个问题,例如《十二公民》中那个刚开始所有人都认定的“一定是富二代杀S了自己的亲身父亲”,到最后大家理性分析和推测之后发现,事情根本不是大多数人(99.9%)以为的那样。

我们很容易被他人的说辞所误导,相信我们愿意相信的事,听我们愿意听的事,然后被舆论所支配,在人云亦云之中渐渐的迷失自我,然后丧失自己独立思考的能力。

学技术也是一样,尽信书不如无书,思考才是学习的目的,如果读书不是为了启迪自己的智慧,只是为了吹NB,那这个人有很大的概率会一事无成。

那此时我们再回过头来思考这个问题:轻量级锁一定比重量级锁快吗

正文

在回答这个问题之前,我们先来了解一下:什么是轻量级锁?什么是重量级锁?

锁概念

轻量级锁是 JDK 1.6 新增的概念,是相对于传统的重量级锁而已的一种状态,在 JDK 1.5 时,synchronized 是需要通过操作系统自身的互斥量(mutex lock)来实现,然而这种实现方式需要通过用户态与和核心态的切换来实现,但这个切换的过程会带来很大的性能开销,所以在 JDK 1.6 就引入了轻量级锁来避免此问题的发生。

轻量级锁执行过程

再讲轻量级锁执行过程之前,要先从虚拟机的对象头开始说起,HotSpot 的对象头(Object Header)分为两部分

  1. Mark Word 区域,用于存储对象自身的运行时数据,如哈希码(HashCode)、GC 分带年龄等;

  2. 用于存储指向方法区对象类型数据的指针(如果是数组对象的话,还有一个存储数组长度的额外信息)。

Mark Word 在 32 位系统中,有 32bit 空间,其中:

  • 25bit 用来存储 HashCode;

  • 4bit 用来存储对象的分带年龄;

  • 2bit 用来存储锁标志位,01=可偏向锁、00=轻量级锁、10=重量级锁;

  • 1bit 固定为 0。

再说会轻量级锁的执行过程,在代码进入同步块的时候,如果此对象没有被线程所占用,虚拟机会先将此线程的栈帧拷贝一份存储在当前对象的 Lock Record (锁记录) 区域中。

然后虚拟机再使用 CAS (Compare and Swap, 比较并交换) 将本线程的 Mark Word 更新为指向对象 Lock Record 区域的指针,如果更新成功,则表示这个线程拥有了该对象,轻量级锁添加成功,如果更新失败,虚拟机会先检查对象 Mark Word 是否指向了当前线程的线帧,如果是则表明此线程已经拥有了此锁,如果不是,则表明该锁已经被其他线程占用了。如果有两条以上的线程在争抢死锁,那么锁就会膨胀为重量锁,Mark Word 中存储的就是指向重量级锁的互斥量指针,后面等待锁的线程也会进入阻塞状态。

从以上的过程,我们可以看出轻量级锁可以理解为是通过 CAS 实现的,理想的情况下是整个同步周期内不存在锁竞争,那么轻量锁可以有效的提高程序的同步性能,然而,如果情况相反,轻量级锁不但要承担 CAS 的开销还要承担互斥量的开销,这种情况下轻量级锁就会比重量级锁更慢,这就是我们本文的答案。

总结

轻量级锁不是在任何情况下都比重量级锁快的,要看同步块执行期间有没有多个线程抢占资源的情况,如果有,那么轻量级线程要承担 CAS + 互斥量锁的性能消耗,就会比重量锁执行的更慢

关于好与坏和对于错也是这个道理,有些事今天可能是对的,但明天有可能成错的了。比如 JDK 1.5 时,你可以说同步线程只有一个方式:synchronized,然而 JDK 1.6 时又添加了 Lock。你昨天说的对的话,在明天可能就变成错的了。所以对和错其实并不是那么绝对,它也没那么重要,重要的是你得有独立思考的能力和辨识对错认知。

【END】

近期热文

  • HashMap 为什么会导致 CPU 100%?面试突击 006 期

  • 面试突击 005 | Redis 是如何实现高可用的?它的实现方式有哪些?

  • 面试突击 004 | 如何排查 Redis 中的慢查询?视频实战篇

  • 面试突击 003 | Redis 如何实现查询附近的人?

  • 面试突击 002 | Redis 是如何处理已过期元素的?

  • 面试突击 001 | Redis 如何从海量数据中查询出某一个 Key?

关注下方二维码,订阅更多精彩内容

朕已阅 

有人说:轻量级锁一定比重量级锁快!我忍不住笑了相关推荐

  1. 多线程高并发 底层锁机制与优化的最佳实践——各种锁的分类 || synchronized 关键字 倒底锁的是什么东西?|| CAS与ABA问题||锁优化||轻量级锁一定比重量级锁的性能高吗

    多线程高并发 底层锁机制与优化的最佳实践 各种锁的分类 加上synchronized 关键字,共享资源就不会出错 synchronized 关键字 倒底锁的是什么东西? synchronized 锁的 ...

  2. 死锁终结者:顺序锁和轮询锁!

    作者 | 王磊 来源 | Java中文社群(ID:javacn666) 转载请联系授权(微信ID:GG_Stone 死锁(Dead Lock)指的是两个或两个以上的运算单元(进程.线程或协程),都在等 ...

  3. 【Java 并发编程】线程锁机制 ( 线程安全 | 锁机制 | 类锁 | 对象锁 | 轻量级锁 | 重量级锁 )

    文章目录 一.线程安全 二.锁机制 ( 类锁 | 对象锁 ) 三.锁分类 ( 轻量级锁 | 重量级锁 ) 一.线程安全 多个线程同时访问 同一个共享变量 时 , 只要能保证 数据一致性 , 那么该变量 ...

  4. 12.synchronized的锁重入、锁消除、锁升级原理?无锁、偏向锁、轻量级锁、自旋、重量级锁

    小陈:呼叫老王...... 老王:来了来了,小陈你准备好了吗?今天我们来讲synchronized的锁重入.锁优化.和锁升级的原理 小陈:早就准备好了,我现在都等不及了 老王:那就好,那我们废话不多说 ...

  5. 偏向锁、轻量级锁、自旋锁、适应性自旋锁、锁消除、锁粗化

    JDK1.6 对锁的优化: 偏向锁.轻量级锁.自旋锁.适应性自旋锁.锁消除.锁粗化 等技术. 锁主要存在四中状态,依次是: 无锁状态 偏向锁状态 轻量级锁状态 重量级锁状态 锁可以升级不可降级,即 无 ...

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

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

  7. 可重入锁/不可重入锁,公平锁/非公平锁,乐观锁/悲观锁,独享锁/共享锁,偏向锁/轻量级锁/重量级锁,分段锁,自旋锁

    在并发编程中,会涉及到各种各样的锁,这篇文章主要介绍各种锁的分类以及作用. 介绍的内容如下: 可重入锁/不可重入锁 公平锁/非公平锁 乐观锁/悲观锁 独享锁/共享锁 偏向锁/轻量级锁/重量级锁 分段锁 ...

  8. 带你彻底搞懂锁膨胀,偏向锁,轻量级锁,重量级锁

    1.synchronized 我们都知道synchronized内部有四种状态,分别是:无锁.偏向锁.轻量级锁和重量级锁,所以要搞懂这几种锁之间的变化我们得对synchronized有个大致的了解. ...

  9. 偏向锁、轻量级锁、重量级锁加锁过程即锁升级膨胀过程

    偏向锁.轻量级锁.重量级锁加锁过程即锁升级膨胀过程 synchronized 偏向锁 为什么要引入偏向锁 偏向锁加锁过程 线程获取到锁对象的偏向锁之后,执行完同步代码块之后,会释放这个偏向锁吗 使用了 ...

最新文章

  1. TurboMail荣获2010年度优秀电子邮件产品殊荣
  2. Node.js EventEmitter
  3. WPF入门知识(学习)
  4. 增长产品手段——互动策划
  5. openharmony编译报错ubuntu20.04按照官方文档,hb set报错为OHOS ERROR] Invalid vendor path: /home/openharmony/vendor
  6. px4原生源码学习一
  7. 【转】开始iOS 7中自动布局教程(一)
  8. 区别不同浏览器,CSS hack写法
  9. Dart学习笔记01:环境搭建与开发环境配置
  10. 录制完脚本怎么做接口自动化测试_快速构建轻量级接口自动化框架
  11. 一、optimizer_trace介绍
  12. 镀铬亮条怎么修复_「日系之光」曾经的亚洲C级车排面,十二代丰田皇冠全面修复日记...
  13. 使用dnsmasq让本地hosts泛解析
  14. 高等数学(第七版)同济大学 习题1-4 个人解答
  15. word中的左拐箭头和向下箭头的差别
  16. 华为od德科面试数据算法解析 2022-3-20 关于员工工号问题
  17. Python之sep与end
  18. 使用Python获取最新疫情数据,制作可视化动态地图,实时展示各地情况
  19. 计算机安装Hp1005打印机,hp1005打印机驱动
  20. 教程篇(7.0) 06. FortiGate安全 日志记录和监控 ❀ Fortinet 网络安全专家 NSE 4

热门文章

  1. pytorch:加载预训练模型(多卡加载单卡预训练模型,多GPU,单GPU)
  2. linux基线核查脚本
  3. MYSQL安装与库的基本操作
  4. 性能测试调优篇---未完待续
  5. CSS深入理解学习笔记之vertical-align
  6. Gartner: 2017年11大信息安全技术(解读版)
  7. UIScrollView的简单使用
  8. python序列切片
  9. JavaScript--变量、作用域及内存(12)
  10. 为什么我要选择erlang+go进行server架构(2)