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

【多线程】计算机领域中的各种锁

【多线程】计算机领域中的各种锁

本文来自于我关于多线程系列文章。欢迎阅读、点评与交流
1.【多线程】互斥锁(Mutex)是什么?
2.【多线程】计算机领域中的各种锁
3.【多线程】信号量(Semaphore)是什么?
4.【多线程】信号量(Semaphore)常见的应用场景

计算机领域的锁种类繁多,它们可以从不同的维度进行分类,例如实现层面、设计思想、状态策略等。下面这个表格梳理了常见的锁类型、核心特征以及典型的应用场景或代表实现。

锁的类型核心特征应用场景 / 代表实现
🔒 按实现层面
互斥锁 (Mutex)独占访问,未获取锁的线程会被阻塞操作系统同步机制,Java synchronized 的底层
读写锁 (ReadWriteLock)共享读(多个线程可同时读),独占写(写时互斥)ReentrantReadWriteLock (Java),适用于读多写少的场景
自旋锁 (Spinlock)尝试获取锁失败时,进行忙等待(循环),避免线程切换适用于锁持有时间极短的场景;Java 中的 CAS 操作
条件变量 (Condition Variable)与互斥锁配合,用于等待某个条件成立,会释放互斥锁线程间协同,如生产者-消费者模型
信号量 (Semaphore)计数器,控制同时访问资源的线程数量限制并发线程数,连接池资源管理
🔒 按设计思想
乐观锁 (Optimistic Locking)假设冲突很少,先直接修改,提交时用版本号或CAS检测冲突数据库版本号、Java AtomicInteger 等原子类
悲观锁 (Pessimistic Locking)假设冲突频繁,访问资源前先加锁,确保独占Java synchronized 关键字、ReentrantLock
🔒 按状态策略(特指 synchronized)
偏向锁 (Biased Locking)仅一个线程访问时,通过标记避免同步操作Java synchronized 的锁优化初始状态
轻量级锁 (Lightweight Locking)少量线程竞争时,通过 CAS 自旋尝试获取锁synchronized 竞争加剧时的状态
重量级锁 (Heavyweight Locking)竞争激烈时,未获锁线程会被操作系统挂起阻塞synchronized 竞争进一步加剧的状态
🔒 按其他特性
可重入锁 (Reentrant Lock)同一线程可多次获取同一把锁,防止死锁Java ReentrantLocksynchronized
公平锁 / 非公平锁 (Fair/Non-fair)公平锁按申请顺序分配;非公平锁允许插队,吞吐量通常更高ReentrantLock(true) 为公平锁,默认非公平
分段锁 (Segmented Lock)细化锁粒度,将数据分段,每段独立加锁ConcurrentHashMap (JDK7) 中的 Segment

💡 理解锁的升级与优化

Java中的synchronized关键字是理解锁优化的一个好例子。为了平衡性能和安全性,JVM会根据竞争情况自动进行锁升级:无锁 → 偏向锁 → 轻量级锁 → 重量级锁。这个过程旨在减少不必要的重量级锁开销。此外,JVM还会进行锁粗化,将多个连续的加锁、解锁操作合并为一个范围更大的锁,以减少性能损耗。

💎 小结与建议

选择哪种锁取决于你的具体场景:

  • 追求极致性能且冲突概率小:考虑乐观锁
  • 写操作频繁或临界区逻辑复杂悲观锁更稳妥。
  • 读远多于写读写锁可以显著提升并发度。
  • 锁持有时间非常短自旋锁能避免线程切换的开销。
  • 需要复杂的线程协作条件变量是标准工具。
http://www.dtcms.com/a/405896.html

相关文章:

  • python+uniapp基于微信小程序的医院陪诊预约系统
  • 免费html网页模板 html5网站模板 静态网页模板
  • 网站怎么做区域性优化公司网站建设会计上怎么处理
  • 专业商城网站建设价格定制家具网
  • ABCTorrents官网入口 – 磁力搜索引擎网站
  • python+django/flask+uniapp基于微信小程序的瑜伽体验课预约系统
  • 设计模式(C++)详解——解释器模式(1)
  • iOS 26 系统流畅度深度剖析,Liquid Glass 视效与界面滑动的实际测评
  • mysql asp网站2001国产卡一卡二新区
  • Docker容器化部署简要指南
  • 一文掌握 Apache SeaTunnel 构建系统与分发基础架构
  • 【数据结构】常用数据结构深度剖析
  • 适合小型网络公司的建站方式可以为网络黄页推广大全4
  • 男女性直接做的视频网站网页首页管理系统
  • 数字孪生 3D 风电场:HT 海上风电智慧化解决方案
  • 示波器使用,查看3d线扫相机的问题
  • 【汽车篇】基于深度学习的2D+3D整车漆面外观缺陷检测
  • (14)ASP.NET Core2.2 中的日志记录
  • Three.js 开发实战教程(五):外部 3D 模型加载与优化实战
  • SpringBoot 整合机器学习框架 Weka 实战操作详解:从 0 到 1 构建可扩展的智能预测微服务
  • 【qml-10】Quick3D实现机器人渲染(mesh)记录
  • 解构IDP未来前景:去中心化金融的“阳谋”与以人为本的生态蓝图(解读)
  • 怎么做淘宝网站百度公司招聘官网最新招聘
  • 【国标36964解读】《软件工程软件开发成本度量规范》(GB/T36964-2018)解读
  • 在 Windows 11 上从零复现 3D Gaussian Splatting (3DGS)
  • 软件设计师软考备战:第五篇 软件工程与项目管理
  • 接口访问速度突然变慢,怎么排查
  • C++ IO 库全方位解析:从基础到实战
  • 从“手机拆修”看懂POD与非POD的区别
  • vc无法启动