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

Java公平锁和非公平锁实现原理

在Java中,锁的实现主要通过java.util.concurrent.locks包下的Lock接口及其实现类(如ReentrantLock)来完成。这些锁提供了比synchronized关键字更灵活的锁定机制,包括公平锁(Fair Lock)和非公平锁(Non-fair Lock)。

1. 公平锁与非公平锁的区别

公平锁(Fair Lock):公平锁会按照请求锁的顺序来依次获得锁,即按照线程请求锁的顺序来分配锁,保证了线程调度的公平性。在ReentrantLock中,可以通过构造函数指定是否为公平锁,例如:

Lock fairLock = new ReentrantLock(true); // 创建公平锁

非公平锁(Non-fair Lock):非公平锁在尝试获取锁时会直接尝试,而不是按照请求的顺序,这通常会导致某些线程可能会更快地获得锁,但这也可能导致某些线程饥饿(即长时间无法获取锁)。在ReentrantLock中,如果不指定为公平锁,则默认为非公平锁:

Lock unfairLock = new ReentrantLock(); // 默认创建非公平锁

2. 实现原理

非公平锁

非公平锁的实现通常依赖于CASCompare-And-Swap)操作或者通过一个简单的循环尝试来获取锁。当线程尝试获取锁时,它会检查锁的状态:

  • 如果锁当前未被占用,线程会尝试立即获取锁。

  • 如果锁已被其他线程占用,线程会直接进入等待状态,或者在下次调度时再次尝试获取。

这种实现方式简单且高效,但可能导致某些线程饥饿。

公平锁

公平锁的实现通常涉及到更多的调度逻辑,以确保线程按照请求的顺序获取锁。在ReentrantLock中,公平锁的实现通常涉及到维护一个队列(如AbstractQueuedSynchronizer中的队列),线程在请求锁时会先尝试将自身加入到等待队列的末尾,然后按照队列中的顺序来获取锁。具体步骤如下:

  1. 线程请求锁时,首先检查是否有线程在等待队列中。

  2. 如果有,则当前线程会被放置在队列的末尾。

  3. 持有锁的线程释放锁后,会从队列头部取出下一个线程(即队列中最先等待的线程),并允许其获取锁。

3. 代码示例

非公平锁示例

Lock lock = new ReentrantLock(); // 默认非公平锁
lock.lock();
try {// 临界区代码
} finally {lock.unlock();
}

公平锁示例

Lock fairLock = new ReentrantLock(true); // 创建公平锁
fairLock.lock();
try {// 临界区代码
} finally {fairLock.unlock();
}

通过使用ReentrantLock,我们可以根据需要选择公平或非公平的锁定策略,以优化多线程应用性能和资源分配策略。

相关文章:

  • 图论-BFS搜索图/树-最短路径问题的解决
  • 2025 cs144 Lab Checkpoint 2 小白超详细版
  • python 安装win32com.client库
  • ReportLab 导出 PDF(文档创建)
  • vue里provide作用:将一组全局方法注入到 Vue 应用的所有子组件中
  • 【正点原子STM32MP257连载】第四章 ATK-DLMP257B功能测试——USB测试 #USB HOST #USB 鼠标
  • 京东硬核挑战潜规则,外卖算法要变天?
  • 阶段性使用总结-通义灵码
  • 协程从原理到最新的c++协程特性
  • 从服务器多线程批量下载文件到本地
  • 4.14【Q】pc homework3
  • 有序二叉树各种操作实现(数据结构C语言多文件编写)
  • 基础知识:Dify 错误排查
  • 基础学习(4): Batch Norm / Layer Norm / Instance Norm / Group Norm
  • ReactNative中处理安全区域问题
  • 深入解析 OrdinalEncoder 与 OneHotEncoder:核心区别与实战应用
  • Linux——信号量
  • linux 内核 ida机制分析
  • 【SpringMVC】深入解析自定义拦截器、注册配置拦截器、拦截路径方法及常见拦截路径、排除拦截路径、拦截器的执行流程
  • 视觉SLAM和激光SLAM建图输出的文件类型
  • 上海明天有雷雨、大风,下周气温在春日舒适区间
  • 神舟二十号全系统合练今日展开
  • 调查显示特朗普在经济问题上的支持率跌至其总统生涯最低
  • 如何应对国际贸易形势变化?长三角四省市主要领导密集部署
  • 一周文化讲座|读书是通往世界的路
  • 霸王茶姬成美股“中国茶饮第一股”:首日涨近16%,市值60亿美元