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

并发编程-锁的分类

锁的分类

可重入锁&不可重入锁

  1. 可重入:当一个线程获取某个锁后,再次获取这个锁的时候是可以直接拿到的。
  2. 不可重入:当一个线程获取某个锁之后,再次获取这个锁的时候拿不到,必须等自己先释放锁再获取。
  3. synchronized、ReentrantLock、ReentrantLockReadWriteLock都是可重入锁。

乐观锁&悲观锁

  1. 乐观锁:当一个获取不到锁时,可以再次让CPU调度,重新尝试获取锁
  2. 悲观锁:当一个线程获取不到资源时,线程被挂起(BLOCKED,WAITING状态)。注意:线程挂起涉及到内核态和用户态的切换,比较消耗资源
  3. 用户态:JVM可以自行执行的指令,不需要操作系统执行。
  4. 内核态:JVM不可以自行执行,需要操作系统执行。
  5. synchronized、ReentrantLock、ReentrantLockReadWriteLock都是悲观锁,而Java中的CAS操作是一种乐观锁的实现。

共享锁&互斥锁

  1. 互斥锁:同一时间点只能有一个线程持有互斥锁。
  2. 共享锁:同一时间可以允许多个线程同时持有共享锁。
  3. synchronized和ReentrantLock是互斥锁。
  4. ReentrantLockReadWriteLock在读锁时候是共享锁,写锁时候是互斥锁。

公平锁&非公平锁

假设A线程持有锁,B线程正在等待锁,这个时候C线程来了

  1. 公平锁:C线程必须再B线程之后排队,必须等B线程获取锁或取消排队后C线程才能尝试获取锁。
  2. 非公平锁:C线程无视B的存在,先尝试获取锁,如果拿到锁就可以去执行业务逻辑,如果没拿到还是要去B线程后排队,等待B线程拿到锁,才能尝试获取锁
  3. synchronized是非公平锁
  4. ReentrantLock、ReentrantLockReadWriteLock可以是公平锁,也可以是非公平锁。
http://www.lryc.cn/news/400385.html

相关文章:

  • K8S系列-Kubernetes基本概念及Pod、Deployment、Service的使用
  • 在VSCode上创建Vue项目详细教程
  • Go语言入门之流程控制简述
  • 接口测试框架基于模板自动生成测试用例!
  • C++ STL stable_sort用法
  • YOLO v8进行目标检测的遇到的bug小结
  • FastAPI -- 第二弹(响应模型、状态码、路由APIRouter、后台任务BackgroundTasks)
  • 案例 | 人大金仓助力山西政务服务核心业务系统实现全栈国产化升级改造
  • 如何用python写接口
  • 轻量级可扩展易航网址引导系统源码V2.45
  • 解决ESLint和Prettier冲突的问题
  • C判断一个点在三角形上
  • 物业系统自主研发接口测试框架
  • 手机和电脑通过TCP传输
  • Git 在commit后,撤销commit
  • 多模态大模型 - MM1
  • FPGA设计之跨时钟域(CDC)设计篇(2)----如何科学地设计复位信号?
  • GPS北斗标准时钟同步服务器结构是什么?安徽京准
  • 9.5 栅格图层符号化多波段彩色渲染
  • 力扣第九题
  • 鞭炮插画:成都亚恒丰创教育科技有限公司
  • python 循环
  • 映美精黑白相机IFrameQueueBuffer转halcon的HObject
  • Linux的load(负载)
  • 杜比全景声——空间音频技术
  • C 语言指针进阶
  • SpringBootWeb 篇-入门了解 Swagger 的具体使用
  • Python面试题:如何在 Python 中处理大数据集?
  • C++:入门基础
  • 微信小游戏 彩色试管 倒水游戏 逻辑 (二)