当前位置: 首页 > news >正文

Java中常见的锁分类以及对应特点

对于 Java 锁的分类没有严格意义的规则,我们常说的分类一般都是依据锁的特性、锁的设计、锁的状态等进行归纳整理的,所以常见的分类如下:

公平锁和非公平锁:公平锁是多线程按照锁申请的顺序获取锁,非公平锁就是没有顺序、完全随机,所以会造成优先级反转或者饥饿现象:sychronized就是非公平锁,ReentrantLock(使用CAS和AQS实现)通过参数构造是公平锁还是非公平锁,默认是非公平锁,非公平锁的吞吐量性能比公平锁高很多。

可重入锁:又名递归锁,指在同一个线程在外层获得锁的时候在进入内层方法自动获得锁,sychronized和reentrantLock都是可重入锁,可重入锁在一定程序上可以避免死锁。

独占锁、共享锁:独占锁是指该锁一次只能被一个线程持有,共享锁是指该锁可以被多个线程持有,sychronized和reentrantlock都是独占锁,readwritelock的读锁是共享锁,写锁是独占锁,reentrantlock是独占锁和共享锁也是通过AQS实现的。

互斥锁、读写锁:其实就是独占锁、共享锁的具体说法:互斥锁实质就是reentrantlock,读写锁实质就是readwritelock。

乐观锁、悲观锁:这个分类不是具体锁的分类,而是看待并发同步的分类,悲观锁认为对同一个数据的并发操作一定是会发生修改的,实际哪怕没修改也被认为修改了,因此对于同一个数据的并发操作采用悲观锁加锁的形式,因为悲观锁认为不加锁一定有问题,乐观锁则认为对于同一个数据的并发操作是不会发生修改的,在更新数据的时候会采用不断的尝试更新,乐观锁认为不加锁是并发问题是没事的,由此可以看出悲观锁适合写操作非常多的场景乐观锁适合读操作非常多的场景,不加锁会带来大量的性能提升,悲观锁在 java 中很常见,乐观锁其实就是基于 CAS 的无锁编程,譬如 java 的原子类就是通过 CAS 自旋实现的。

分段锁:实际是锁的一种设计机制,不是具体的锁,其实ConcurrentHashMap实现高并发的就是通过分段锁的形式实现高效并发操作的,当要put元素时并不是对整个HashMap加锁,而是先要hashcode知道它要放在哪个分段,然后对分段进行加锁,所以多线程put元素时只要放的不是同一个分段就做到了并行插入,但是统计size时就需要获得所有的分段锁才能统计,分段锁的设计是为了细化锁粒度

偏向锁、轻量级锁、重量级锁:这种分类是按照锁状态来归纳的,并且是针对 synchronized 的,java 1.6 为了减少获取锁和释放锁带来的性能问题而引入的一种状态,其状态会随着竞争情况逐渐升级,锁可以升级但不能降级,意味着偏向锁升级成轻量级锁后无法降为偏向锁,这种升级无法降级的策略目的就是为了提高获得锁和释放锁的效率

自旋锁:其实是相对于互斥锁的概念,互斥锁线程会进入 WAITING 状态和 RUNNABLE 状态的切换,涉及上下文切换、cpu 抢占等开销,自旋锁的线程一直是 RUNNABLE 状态的,一直在那循环检测锁标志位,机制不重复,但是自旋锁加锁全程消耗 cpu,起始开销虽然低于互斥锁,但随着持锁时间加锁开销是线性增长。

可中断锁:sychronized是不可中断的,lock是可以中断的,这里的可中断建立在阻塞等待中断,运行中是无法中断的。

 

转载于:https://www.cnblogs.com/cherish010/p/8603473.html

相关文章:

  • 如何做好银行金融舆情风险监测和方法工作的技术解决办法
  • Codeforces 707C. Pythagorean Triples-推公式的数学题
  • 网上与舆情通软件功能技术类似的系统整合
  • 319作业
  • 网上涉廉政网络舆情信息工作怎么做的平台服务方案
  • 字符串练习
  • 政企单位如何做好网络舆情监测与分析研判工作的方法措施
  • 政务舆情数据信息监测工作如何做的具体措施与解决方法
  • 某一新闻事件舆情舆论监测工作怎么做的系统解决办法
  • 社交平台舆情动态如何监测的方法
  • 某一事件的传播发展趋势数据如何分析研判的技术方法技巧
  • 176. Second Highest Salary
  • 大数据舆情监测与分析平台有何作用功能及相关软件排名如何详解
  • try...except..
  • 新媒体舆情监测与分析工作如何开展的方法
  • bearychat的java client
  • Docker: 容器互访的三种方式
  • ECMAScript入门(七)--Module语法
  • Elasticsearch 参考指南(升级前重新索引)
  • gf框架之分页模块(五) - 自定义分页
  • Java到底能干嘛?
  • js数组之filter
  • Koa2 之文件上传下载
  • 反思总结然后整装待发
  • 今年的LC3大会没了?
  • 可能是历史上最全的CC0版权可以免费商用的图片网站
  • 悄悄地说一个bug
  • 山寨一个 Promise
  • 微信开源mars源码分析1—上层samples分析
  • 新手搭建网站的主要流程
  • ​io --- 处理流的核心工具​
  • #NOIP 2014# day.1 生活大爆炸版 石头剪刀布
  • #QT(TCP网络编程-服务端)
  • #单片机(TB6600驱动42步进电机)
  • (04)Hive的相关概念——order by 、sort by、distribute by 、cluster by
  • (39)STM32——FLASH闪存
  • (Bean工厂的后处理器入门)学习Spring的第七天
  • (Redis使用系列) SpringBoot中Redis的RedisConfig 二
  • (八十八)VFL语言初步 - 实现布局
  • (多级缓存)缓存同步
  • (每日持续更新)信息系统项目管理(第四版)(高级项目管理)考试重点整理 第13章 项目资源管理(七)
  • (算法)Game
  • (转)拼包函数及网络封包的异常处理(含代码)
  • (转)微软牛津计划介绍——屌爆了的自然数据处理解决方案(人脸/语音识别,计算机视觉与语言理解)...
  • (转载)(官方)UE4--图像编程----着色器开发
  • .cn根服务器被攻击之后
  • .net redis定时_一场由fork引发的超时,让我们重新探讨了Redis的抖动问题
  • .Net Remoting常用部署结构
  • .net Stream篇(六)
  • .NET 表达式计算:Expression Evaluator
  • .net 前台table如何加一列下拉框_如何用Word编辑参考文献
  • .Net6使用WebSocket与前端进行通信
  • .Net6支持的操作系统版本(.net8已来,你还在用.netframework4.5吗)
  • .Net各种迷惑命名解释
  • 。Net下Windows服务程序开发疑惑