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

并发编程的锁有哪些?怎么分类?

文章目录

  • 一、按【实现方式】分类
    • 1. synchronized(JVM内置锁)
    • 2. lock(JUC显示锁)
  • 二、按【线程是否阻塞】分类
    • 1. 阻塞锁
    • 2. 自旋锁
  • 三、 按【是否公平】划分
  • 1. 公平锁
    • 2. 非公平锁
  • 四、按【锁的重入性】划分
    • 1. 可重入锁
    • 2. 不可重入锁
  • 五、 按【锁的作用范围】划分
    • 1. 独占锁(写锁)
    • 2. 共享锁(读锁)
  • 六、按【底层实现思想】划分
    • 1. 乐观锁
    • 2. 悲观锁

一、按【实现方式】分类

1. synchronized(JVM内置锁)

JVM级别的锁
特点:

  1. 关键字
  2. 自动加锁、自动释放锁
  3. 锁的是对象或者类
  4. 可重入
    用法:
synchronized(this){}publicsynchronizedvoidmethod(){}publicstaticsynchronizedvoidstaticMethod(){}

锁升级过程:

无锁 → 偏向锁 → 轻量级锁 → 重量级锁

优点:

  1. 简单
  2. JVM深度优化
  3. 不容易出错

缺点:

  1. 不够灵活
  2. 不能中断
  3. 不能尝试获取

2. lock(JUC显示锁)

代表:ReentrantLock

Locklock=newReentrantLock();lock.lock();try{// 临界区}finally{lock.unlock();}

特点

  • 必须手动释放锁
  • 支持:
    • 可终端锁
    • 尝试锁(tryLock)
    • 公平锁
    • 条件变量

适用场景

  • 高并发
  • 复杂业务
  • 许哟啊精细控制锁的行为

二、按【线程是否阻塞】分类

1. 阻塞锁

拿不到锁就坐等

  • synchronized
  • ReentrantLock.lock()
    优点
  • 逻辑简单
  • 对CPU友好
    缺点
  • 线程切换成本高

2. 自旋锁

拿不到锁就原地打转

  • 常见于CAS(底层实现)
  • AtomicInteger
  • JVM内部的轻量级锁
    优点:
  • 避免线程切换
  • 适合锁时间极短的场景
    缺点
  • 占用CPU

三、 按【是否公平】划分

1. 公平锁

先到先得,排队买票

newReentrantLock(true);

特点

  • 线程按申请顺序获得锁
  • 吞吐量较低
    适合场景
  • 业务对公平性要求
  • 避免线程饥饿

2. 非公平锁

允许插队,效率优先

newReentrantLock();

特点

  • 吞吐量高
  • 可能导致个别线程等待时间长

四、按【锁的重入性】划分

1. 可重入锁

**同一线程可反复进入

  • synchronized
  • ReentrantLock
synchronizedvoida(){b();}synchronizedvoidb(){}

意义

  • 防止自己把自己锁死
  • java锁的默认能力

2. 不可重入锁

进入一次就够,再来就死锁

  • Java中几乎不用
  • 理论概念,面试用

五、 按【锁的作用范围】划分

1. 独占锁(写锁)

**一次只允许一个线程

  • synchronized
  • ReentrantLock
  • ReentrantReadWriteLock.WriteLock

2. 共享锁(读锁)

多个线程可以同时持有

  • ReentrantReadWriteLock.ReadLock
ReadWriteLockrw=newReentrantReadWriteLock();rw.readLock().lock();// 共享rw.writeLock().lock();// 独占

适合场景

  • 读多写少
  • 缓存、配置读取

六、按【底层实现思想】划分

1. 乐观锁

不加锁,靠冲突检测

  • CAS
  • Atomic*
  • LongAdder
atomic.compareAndSet(old,new);

2. 悲观锁

先锁再说,防一切

  • synchronized
  • ReentrantLock
http://www.cnnetsun.cn/news/53090.html

相关文章:

  • 我不是这样
  • 10.8 总结
  • 列车售票|基于springboot 列车售票系统(源码+数据库+文档)
  • AI驱动的手动测试变革:赋能而非替代
  • 【奶茶Beta专项】【LVGL9.4源码分析】09-core-group
  • 网络安全异想天开(不定期更新)
  • 《CAPL脚本实现CANOE工具 Bus-Off自动恢复(含重试机制)》
  • 力扣1965-丢失信息的雇员
  • Flutter 测试全栈指南:从单元测试到黄金路径验证的工程化实践
  • EtherCAT 逐帧报文解析:配置SM/FMMU
  • Springboot连锁火锅店餐饮管理系统h2dg0(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。
  • Windows系统文件wavemsp.dll丢失或损坏的问题 下载修复
  • Windows系统文件wdi.dll缺失或损坏问题 下载修复
  • 基于风险演进的智能测试策略设计
  • 论文查重焦虑成流量密码?虎贲等考 AI 直接用免费模式,打破行业游戏规则
  • vue基于Spring Boot的高职院校贫困生困难生智慧关爱系统的开发_f0txl8vu
  • AI 写论文哪家强?虎贲等考 AI!毕业论文全链路 “超级哇塞”,开题到答辩一路开挂~
  • Coze平台指南(1):coze平台概览与测试应用展望
  • 生物识别系统的测试安全性与漏洞防护实践
  • 我终于停止写 JUnit 了!用 JavaParser + GPT-4 自动生成 90% 覆盖率的单元测试
  • 源码读不下去?阿里架构师教你“三步走”阅读法,彻底告别“打开源码就犯困”
  • 大梵公考:国考省考每一年的岗位一样吗?
  • 大梵公考:国考和省考二选一怎么选?
  • Java中如何检测死锁?如何预防和避免线程死锁?
  • Day32 类的定义和方法
  • 自动化测试-关键数据记录(日志+截图+页面源码)
  • IPv4地址与IPv6地址
  • 探索非线性电液伺服系统:从PID到反步控制的奇妙之旅
  • 使用 Python 语言 从 0 到 1 搭建完整 Web UI自动化测试学习系列 33--基础知识 8--切换窗口句柄
  • 某安全so库深度解析