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

锁机制详解:公平锁与非公平锁

锁的基本概念

非公平锁:线程获取锁时不遵循先来后到的顺序,而是直接尝试获取。若获取失败,则进入等待队列;若成功,则直接持有锁。

公平锁:严格按照线程申请锁的顺序分配锁资源,所有线程必须在队列中排队等候,确保队首线程优先获得锁。


优缺点分析

公平锁

优点

  • 保障所有线程都能公平获取资源
  • 避免线程在队列中无限等待(饥饿现象)

缺点

  • 吞吐量显著下降
  • 除队首线程外,其余线程均处于阻塞状态
  • CPU唤醒阻塞线程的开销较大

非公平锁

优点

  • 减少CPU唤醒线程的开销
  • 整体吞吐效率更高
  • CPU无需唤醒所有线程

缺点

  • 可能导致队列中的线程长时间无法获取锁
  • 存在线程饥饿风险

ReentrantLock 实现

ReentrantLock 提供两种锁实现,通过构造方法指定类型:

// 默认非公平锁
public ReentrantLock() {sync = new NonfairSync();
}// 可选的公平锁
public ReentrantLock(boolean fair) {sync = fair ? new FairSync() : new NonfairSync();
}

默认情况下使用非公平锁,因其效率和吞吐量明显优于公平锁。


非公平锁实现

核心逻辑位于 NonfairSync 类:

static final class NonfairSync extends Sync {private static final long serialVersionUID = 7316153563782823691L;final void lock() {if (compareAndSetState(0, 1))setExclusiveOwnerThread(Thread.currentThread());elseacquire(1);}protected final boolean tryAcquire(int acquires) {return nonfairTryAcquire(acquires);}
}

工作机制:

  1. 执行 lock() 时首先尝试 CAS 操作
  2. 若 CAS 成功(state 从 0 变为 1),表示锁未被占用
  3. 将当前线程设置为独占线程
  4. 若获取失败,则进入排队流程

公平锁实现

核心逻辑位于 FairSync 类:

static final class FairSync extends Sync {private static final long serialVersionUID = -3000897897090466540L;final void lock() {acquire(1);}protected final boolean tryAcquire(int acquires) {final Thread current = Thread.currentThread();int c = getState();if (c == 0) {if (!hasQueuedPredecessors() &&compareAndSetState(0, acquires)) {setExclusiveOwnerThread(current);return true;}}else if (current == getExclusiveOwnerThread()) {int nextc = c + acquires;if (nextc < 0)throw new Error("Maximum lock count exceeded");setState(nextc);return true;}return false;}
}

关键区别:

  • 在 CAS 操作前增加了 hasQueuedPredecessors() 检查
  • 仅当 AQS 队列为空时才会尝试获取锁
  • 严格遵循先来后到的排队顺序
http://www.dtcms.com/a/582366.html

相关文章:

  • 用vs2010做网站教程哪里网站建设便宜
  • 广州专业制作网站杭州网络优化公司排名
  • 建信建设投资有限公司网站网络营销品牌推广
  • asp 网站卡死多层次网络营销合法吗
  • 网站建设项目资金申请报告策划书的推广与运营
  • 网站开发可选择的方案学做立体书的网站
  • 网站建站流程网页设计制作页面
  • 基于SMPC随机模型预测控制的IEEE6电网系统matlab仿真,对比不允许负荷响应和允许负荷响应
  • 2025山西省网络安全职业技能大赛PWN方向题解
  • 郑州网站建设技术精粹一站式网站建设架构
  • 2025 年世界职业院校技能大赛机械设计与制造赛道备赛方案
  • 【2025软考高级架构师】——2024年11月架构真题解析
  • 基于HAL库实现看门狗喂狗实时时钟睡眠停止模式ADC采集w25qx写入读取
  • Linux系统编程——多线程编程(一)
  • 建设钓鱼网站源码网站seo优化心得
  • 关方网站买微信我们做网站 出教材 办育心经
  • python+django/flask基于深度学习的个性化携程美食数据推荐系统
  • VRRP虚拟路由冗余
  • 嵌入式软件OTA升级,有哪几种FLASH划分方式?
  • wordpress 投稿者 权限厦门做网站seo
  • 玩转Rust高级应用 如何避免对空指针做“解引用”操作,在C/C++ 里面就是未定义行为
  • 音视频处理(三):hls协议和m3u8详解和视频下载爬虫实战
  • Java面试全生态图谱(2025体系版)
  • 亳州做网站的公司公司品牌网站建设
  • 泉州网站公司wordpress 搜索乱码
  • SG-EIP-MOD-210(EtherNet/IP 转 Modbus 网关)
  • TDengine 字符串函数 CONCAT_WS 用户手册
  • SmartDV宣布其MIPI® SoundWire® I3S℠ 1.0 IP产品组合已向多家客户提供授权
  • 如何将本地文件上传至Github?【详细解释】
  • 酒店网站可以怎么做网站下雪代码