news 2026/5/11 17:52:50

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

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
并发编程的锁有哪些?怎么分类?

文章目录

  • 一、按【实现方式】分类
    • 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
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/5/9 2:55:16

汇编语言全接触-26.启动画面

上一章我们学习了位图的使用.在这一章我们要用上帝赋予我们的创造力来融会贯通上一章我们学到的知识.那就是研究如何用位图来创建启动画面. 你可以在这里下载示范: the example. 理论首先,我们先要搞清楚什么是启动画面.举个简单的例子:我们启动某些作的专业一点的程序时(比如N…

作者头像 李华
网站建设 2026/5/10 21:16:50

随机抽奖算法实现与对比:聚焦洗牌算法(Fisher-Yates)

期末课程设计中,我和团队成员共同完成了 “随机抽奖算法实现与比较” 的课题。本次设计的核心目标是模拟实际抽奖场景,从指定号码范围(min_num 到 max_num)中抽取 k 个不重复的中奖号码,并通过实现四种不同算法&#x…

作者头像 李华
网站建设 2026/5/9 1:59:18

【Hadoop+Spark+python毕设】物联网网络安全威胁数据分析系统、计算机毕业设计、包括数据爬取、数据分析、数据可视化、Hadoop、实战教学

🎓 作者:计算机毕设小月哥 | 软件开发专家 🖥️ 简介:8年计算机软件程序开发经验。精通Java、Python、微信小程序、安卓、大数据、PHP、.NET|C#、Golang等技术栈。 🛠️ 专业服务 🛠️ 需求定制化开发源码提…

作者头像 李华
网站建设 2026/5/9 1:54:03

Springboot连锁药店进销存业务系统98i85(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。

系统程序文件列表项目功能:员工,供应商,药品信息,药品采购,进货出库,药品销售,退货入库,药品报损,药品销毁开题报告内容基于SpringBoot的连锁药店进销存业务系统开题报告一、选题背景与意义1.1 行业现状与痛点随着医疗行业的快速发展和人们对健康需求的日益增加&…

作者头像 李华
网站建设 2026/5/9 1:54:06

智能测试指标动态权重分配研究

随着人工智能与机器学习技术在软件测试领域的深度渗透,传统静态权重分配模式已难以适应瞬息万变的测试环境。本文基于2025年行业实践数据,提出以动态权重分配为核心的新型测试评估体系,通过构建具备自适应能力的指标权重矩阵,有效…

作者头像 李华
网站建设 2026/5/9 2:25:41

std::promise 重难点

std::promise 重难点全拆解 std::promise 是 C11 异步编程的核心组件,但其难点不在于语法本身,而在于状态管理、生命周期控制、异常传递等“隐性规则”——踩中任何一个都可能导致程序崩溃或逻辑异常。本文用“专业底层逻辑通俗比喻分步实操”的方式&…

作者头像 李华