点击上方 好好学java ,选择 星标 公众号

重磅资讯、干货,第一时间送达
今日推荐:一个线程池 bug 引发的 GC 思考!个人原创+1博客:点击前往,查看更多
链接:https://segmentfault.com/a/1190000022041809

synchronized 底层实现由jvm 保证,

在jvm 运行过程中,可能出现 偏向锁,轻量级锁,重量级锁 (锁的重量依次加重)

偏向锁 实现是在 先确认偏向锁标识是可获得状态,第一次获取到锁的时候,将对象的 mark word 中的偏向锁线程的标识为自己,下一次进入到同步块的时候,直接获取锁。当有其他线程竞争锁的时候,发现 markword 并不是自己,会尝试进行一次 cas 替换,如果不成功,就会将锁升级为轻量级锁 消耗:极少

轻量级锁 实现:在执行同步块之前,jvm 会先在当前线程的栈帧中创建用于存储所锁记录的空间,并将对象头中 markWord 复制到锁记录中,。然后线程尝试使用 cas 将对象头中的 mark word 替换为指向锁记录的指针,如果成功,当前线程获得锁,如果失败,说明以有竞争,当前线程会使用自旋来获取锁。自旋获取锁失败,会将对象头的锁标识改为重量级指针。解锁的时候,会使用原子 Cas 操作将 Displaced Mark Word 替换为对象头,成功说明没有发生竞争, 如果失败,说明当前锁存在竞争,锁会膨胀为重量级锁。

消耗:复制和自旋

重量级锁:

Synchronized是通过对象内部的一个叫做监视器锁(monitor)来实现的。但是监视器锁本质又是依赖于底层的操作系统的Mutex Lock来实现的。而操作系统实现线程之间的切换这就需要从用户态转换到核心态,这个成本非常高,状态之间的转换需要相对比较长的时间,这就是为什么Synchronized效率低的原因。因此,这种依赖于操作系统Mutex Lock所实现的锁我们称之为“重量级锁”。JDK中对Synchronized做的种种优化,其核心都是为了减少这种重量级锁的使用。JDK1.6以后,为了减少获得锁和释放锁所带来的性能消耗,提高性能,引入了“轻量级锁”和“偏向锁”。

reentrantLock 的实现:

reentrantLock基于 AQS 实现。AQS 内部通过对 volatile 的 state 读写以及cas 操作 和在某些条件下让线程进入阻塞状态实现。

volatile 消耗小于 synchronized ,reentrantLock 中某些条件下让线程进入阻塞状态 的消耗 可能与 synchronized 相当。

因此 性能 偏向锁 > 轻量级锁 > reentrantLock > synchronized

而偏向锁 和轻量级锁 能够启用是在特殊条件下的。

reentrantLock 和 synchronized 哪个性能高?相关推荐

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

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

  2. Java中的ReentrantLock和synchronized两种锁定机制的对比

    原文:http://www.ibm.com/developerworks/cn/java/j-jtp10264/index.html 多线程和并发性并不是什么新内容,但是 Java 语言设计中的创新之 ...

  3. ReentrantLock与synchronized

    1.ReentrantLock 拥有Synchronized相同的并发性和内存语义,此外还多了 锁投票,定时锁等候和中断锁等候线程A和B都要获取对象O的锁定,假设A获取了对象O锁,B将等待A释放对O的 ...

  4. ReentrantLock和synchronized两种锁定机制

    ReentrantLock和synchronized两种锁定机制 应用synchronized同步锁 把代码块声明为 synchronized,使得该代码具有 原子性(atomicity)和 可见性( ...

  5. hashtable,dictionary 从原理上说说有什么异同,哪个性能高一些

    hashtable里存的对象全部是object类型 ,所有对象存进去都被转成object类型,读取出来每次都需要转换类型,hashtable对存入的类型没有限制 , 因此在读取转换类型时容易出错, d ...

  6. 面试官:你说说ReentrantLock和Synchronized区别!

    大家好!又和大家见面了.为了避免面试尴尬,今天同比较通俗语言和大家聊下ReentrantLock和Synchronized区别!另外:整理了一份Java面试宝典完整版PDF,已成文档 使用方式 Syn ...

  7. imageNamed和imageWithContextOfFile的区别?哪个性能高

    imageNamed性能高 1.用imageNamed的方式加载时,图片使用完毕后缓存到内存中,内存消耗多,加载速度快.即使生成的对象被 autoReleasePool释放了,这份缓存也不释放,如果图 ...

  8. Java多线程中使用ReentrantLock、synchronized加锁 简单举例

    Java多线程中使用ReentrantLock.synchronized加锁 简单举例 public class Demo {final static Lock lock = new Reentran ...

  9. c#随机数生成编号_忘掉 Snowflake,感受一下性能高出587倍的全局唯一ID生成算法...

    今天我们来拆解 Snowflake 算法,同时领略百度.美团.腾讯等大厂在全局唯一 ID 服务方面做的设计,接着根据具体需求设计一款全新的全局唯一 ID 生成算法.这还不够,我们会讨论到全局唯一 ID ...

最新文章

  1. 厉害!苏炳添即将在暨南大学成立短跑实验室
  2. 两块 硬盘 主从盘跳线详解
  3. 用AI写出的第一本书面世:先进算法能对机器生成的内容负责吗?
  4. CentOS7 开机自启动脚本 chkconfig方式
  5. opencv中的腐蚀与膨胀(转)
  6. linux操作系统使用论文_Linux学习2 使用VirtualBox安装国产深度操作系统
  7. pku 1151 (简单离散化求矩形覆盖总面积)
  8. springboot2.x整合JavaMail以qq邮箱发送邮件
  9. 输出字符串全排列 c语言,41.输出全排列-题解(C语言代码)
  10. 分赛区决赛见!2021eBay全国跨境电商创新创业大赛分赛区决赛晋级名单
  11. MTI姿态传感器学习笔记
  12. 有关HTML的学习笔记
  13. 静态路由的配置,实现全网可达
  14. 一文让你快速了解并入手ChatGPT,并【分享】免梯子的GPT,让你体验玩 ChatGPT 的正确姿势
  15. 计算机培训结业典礼主持词,培训结业典礼主持词范例珍藏版(备份存档)
  16. 前美图技术总裁洪小军入职AfterShip 担当CTO助力全球电商服务平台
  17. 如何解决谷歌浏览器不加载Adobe Flash Player的问题
  18. 教育界「拼多多」卖课套路解析
  19. 985高校吐槽大会……
  20. Acer主板装系统报reboot and select proper boot device

热门文章

  1. prompt-toolkit 版本问题
  2. 再谈STM32的CAN过滤器-bxCAN的过滤器的4种工作模式以及使用方法总结
  3. R语言:plot()函数参数合集
  4. C++ Primer 5th笔记(chap 18 大型程序工具) 多重继承与虚继承
  5. C++ Primer 5th笔记(10)chapter10 泛型算法 : read
  6. 操作系统实验——简易FAT16文件系统的实现
  7. 设计模式--状态(State)模式
  8. android文件系统\busybox文件系统的启动介绍
  9. (48)逆向分析 KiFastCallEntry 函数填充 _KTRAP_FRAME 部分
  10. 2020-11-13(四大组件简单回忆内容)