reentrantLock 和 synchronized 哪个性能高?
点击上方 好好学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 哪个性能高?相关推荐
- 多线程高并发 底层锁机制与优化的最佳实践——各种锁的分类 || synchronized 关键字 倒底锁的是什么东西?|| CAS与ABA问题||锁优化||轻量级锁一定比重量级锁的性能高吗
多线程高并发 底层锁机制与优化的最佳实践 各种锁的分类 加上synchronized 关键字,共享资源就不会出错 synchronized 关键字 倒底锁的是什么东西? synchronized 锁的 ...
- Java中的ReentrantLock和synchronized两种锁定机制的对比
原文:http://www.ibm.com/developerworks/cn/java/j-jtp10264/index.html 多线程和并发性并不是什么新内容,但是 Java 语言设计中的创新之 ...
- ReentrantLock与synchronized
1.ReentrantLock 拥有Synchronized相同的并发性和内存语义,此外还多了 锁投票,定时锁等候和中断锁等候线程A和B都要获取对象O的锁定,假设A获取了对象O锁,B将等待A释放对O的 ...
- ReentrantLock和synchronized两种锁定机制
ReentrantLock和synchronized两种锁定机制 应用synchronized同步锁 把代码块声明为 synchronized,使得该代码具有 原子性(atomicity)和 可见性( ...
- hashtable,dictionary 从原理上说说有什么异同,哪个性能高一些
hashtable里存的对象全部是object类型 ,所有对象存进去都被转成object类型,读取出来每次都需要转换类型,hashtable对存入的类型没有限制 , 因此在读取转换类型时容易出错, d ...
- 面试官:你说说ReentrantLock和Synchronized区别!
大家好!又和大家见面了.为了避免面试尴尬,今天同比较通俗语言和大家聊下ReentrantLock和Synchronized区别!另外:整理了一份Java面试宝典完整版PDF,已成文档 使用方式 Syn ...
- imageNamed和imageWithContextOfFile的区别?哪个性能高
imageNamed性能高 1.用imageNamed的方式加载时,图片使用完毕后缓存到内存中,内存消耗多,加载速度快.即使生成的对象被 autoReleasePool释放了,这份缓存也不释放,如果图 ...
- Java多线程中使用ReentrantLock、synchronized加锁 简单举例
Java多线程中使用ReentrantLock.synchronized加锁 简单举例 public class Demo {final static Lock lock = new Reentran ...
- c#随机数生成编号_忘掉 Snowflake,感受一下性能高出587倍的全局唯一ID生成算法...
今天我们来拆解 Snowflake 算法,同时领略百度.美团.腾讯等大厂在全局唯一 ID 服务方面做的设计,接着根据具体需求设计一款全新的全局唯一 ID 生成算法.这还不够,我们会讨论到全局唯一 ID ...
最新文章
- 厉害!苏炳添即将在暨南大学成立短跑实验室
- 两块 硬盘 主从盘跳线详解
- 用AI写出的第一本书面世:先进算法能对机器生成的内容负责吗?
- CentOS7 开机自启动脚本 chkconfig方式
- opencv中的腐蚀与膨胀(转)
- linux操作系统使用论文_Linux学习2 使用VirtualBox安装国产深度操作系统
- pku 1151 (简单离散化求矩形覆盖总面积)
- springboot2.x整合JavaMail以qq邮箱发送邮件
- 输出字符串全排列 c语言,41.输出全排列-题解(C语言代码)
- 分赛区决赛见!2021eBay全国跨境电商创新创业大赛分赛区决赛晋级名单
- MTI姿态传感器学习笔记
- 有关HTML的学习笔记
- 静态路由的配置,实现全网可达
- 一文让你快速了解并入手ChatGPT,并【分享】免梯子的GPT,让你体验玩 ChatGPT 的正确姿势
- 计算机培训结业典礼主持词,培训结业典礼主持词范例珍藏版(备份存档)
- 前美图技术总裁洪小军入职AfterShip 担当CTO助力全球电商服务平台
- 如何解决谷歌浏览器不加载Adobe Flash Player的问题
- 教育界「拼多多」卖课套路解析
- 985高校吐槽大会……
- Acer主板装系统报reboot and select proper boot device
热门文章
- prompt-toolkit 版本问题
- 再谈STM32的CAN过滤器-bxCAN的过滤器的4种工作模式以及使用方法总结
- R语言:plot()函数参数合集
- C++ Primer 5th笔记(chap 18 大型程序工具) 多重继承与虚继承
- C++ Primer 5th笔记(10)chapter10 泛型算法 : read
- 操作系统实验——简易FAT16文件系统的实现
- 设计模式--状态(State)模式
- android文件系统\busybox文件系统的启动介绍
- (48)逆向分析 KiFastCallEntry 函数填充 _KTRAP_FRAME 部分
- 2020-11-13(四大组件简单回忆内容)