博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
synchronized和ReentrantLock性能分析
阅读量:3926 次
发布时间:2019-05-23

本文共 874 字,大约阅读时间需要 2 分钟。

这个文章的起因和一个同事的激烈学术性讨论,快打起来那种。

我:ReentrantLock解决多路并发查询的数据合并方式更合适。

棒哥:用synchronized在资源竞争激烈的性能更好。
我:synchronized在资源竞争激烈的时候有极大的概率会进行锁升级,且锁的升级是不可逆的。
棒哥:ReentrantLock内部的乐观锁自旋比线程挂起更消耗cpu的资源。

存在即合理,我觉得单纯的认为某一种方式好或坏是一种片面的看法,这两种方式应该区分场景和并发量和处理时间来判定使用哪一种合适。特别是synchronized已经和我以前认知的不太一样了,JDK6后续的优化,让越来越多的开发者喜欢使用他。

针对我以前认知synchronized做了一波理解

JDK5中,synchronized是性能低效的,因为这是一个重量级操作,对性能的最大影响是阻塞的实现,挂起线程和恢复线程的操作,都需要转入内核态中完成,给并发带来了很大压力。

JDK6中synchronized加入了自适应自旋、锁消除、锁粗化、轻量级锁、偏向锁等一系列优化,官方也支持synchronized,提倡在synchronized能实现需求的前提下,优先考虑synchronized来进行同步。

在这里插入图片描述
ReentrantLock是标准的乐观锁的实现,内部while的循环,通过判断标识来判断锁是否被其他线程所持有,当其他线程所持有时,就会一直自旋判断锁是否被释放。
在这里插入图片描述
理解内部的原理之后,就很容易理解,如果资源竞争激烈,同时锁竞争激烈,使用乐观锁,就会很多线程中一直在循环等待,当线程数和执行时间到达一个临界值时,可能就会比线程挂起的效率更低,循环等待的开销就会大于线程挂起的开销。所以需要加锁的代码快执行时间普遍很长不建议使用ReentrantLock。
当资源竞争激烈,同时尝试获取锁的线程很多时,部分线程等待过久,如果这个时候使用synchronized,会导致锁慢慢膨胀,资源占有会越来越多。为了保证synchronized的性能,加锁的代码块需要保证,执行时间稳定,不会突然暴增。

转载地址:http://zeugn.baihongyu.com/

你可能感兴趣的文章
spring有三种启动方式
查看>>
大型电子商务网站架构
查看>>
小型电子商务网站设计原则
查看>>
大型Java多用户商城系统设计开发的心得和困难
查看>>
CGLib与JDK的动态代理
查看>>
Java单元测试(Junit+Mock+代码覆盖率)
查看>>
怎样使用 Junit Framework 进行单元测试的编写
查看>>
MAVEN常用命令+基本配置详解 2015
查看>>
java:快速文件分割及合并
查看>>
redis 学习笔记(1)-编译、启动、停止
查看>>
redis 学习笔记(2)-client端示例代码
查看>>
redis 学习笔记(3)-master/slave(主/从模式)
查看>>
redis 学习笔记(4)-HA高可用方案Sentinel配置
查看>>
redis 学习笔记(5)-Spring与Jedis的集成
查看>>
nginx学习(1):编译、安装、启动
查看>>
nginx学习(2):启动gzip、虚拟主机、请求转发、负载均衡
查看>>
企业应用通用架构图
查看>>
深入理解Java:注解(Annotation)基本概念
查看>>
深入理解Java:注解(Annotation)自定义注解入门
查看>>
深入理解Java:注解(Annotation)--注解处理器
查看>>