公平锁指线程按申请顺序获取锁,避免饥饿;2. ReentrantLock默认非公平,可通过new ReentrantLock(true)启用公平模式;3. 公平锁提升调度可预测性但降低性能。

在Java中,ReentrantLock 提供了比内置 synchronized 更灵活的锁机制,其中一个重要特性就是支持公平锁。默认情况下,ReentrantLock 使用的是非公平锁,但可以通过构造函数开启公平模式,从而实现线程按请求顺序获取锁,减少线程“饥饿”问题。
公平锁是指多个线程在竞争锁时,按照申请锁的先后顺序获得锁。也就是说,等待时间最长的线程会优先获取锁。这与非公平锁不同,非公平锁允许插队——即一个刚到达的线程可能比已在等待队列中的线程更早获得锁。
使用公平锁可以提升线程调度的可预测性和公平性,但通常会带来一定的性能开销,因为需要维护等待队列和严格的顺序控制。
通过 ReentrantLock(boolean fair) 构造函数可以指定是否使用公平策略:
立即学习“Java免费学习笔记(深入)”;
new ReentrantLock(true):启用公平锁new ReentrantLock(false):非公平锁(默认)示例代码:
import java.util.concurrent.locks.ReentrantLock;
public class FairLockExample {
private final ReentrantLock lock = new ReentrantLock(true); // 公平锁
private int count = 0;
public void increment() {
lock.lock();
try {
count++;
System.out.println(Thread.currentThread().getName() + " 执行递增,count=" + count);
} finally {
lock.unlock();
}
}
public static void main(String[] args) {
FairLockExample example = new FairLockExample();
Runnable task = example::increment;
for (int i = 1; i <= 5; i++) {
new Thread(task, "Thread-" + i).start();
}
}
}
在这个例子中,五个线程依次尝试获取锁。由于使用了公平锁,它们大概率会按照启动顺序执行,输出结果更接近线程的发起顺序。
虽然公平锁能提升调度公平性,但在实际使用中需要注意以下几点:
ReentrantLock 的公平锁通过构造函数设置为 true 即可启用,适用于需要控制线程访问资源顺序的场景。它提升了多线程环境下的公平性,但也带来了性能成本。合理评估业务需求,在公平性与性能之间做出权衡,才能发挥其最大价值。
基本上就这些,关键在于理解“先来先服务”的机制,并在必要时启用它。
以上就是在Java中如何使用ReentrantLock实现公平锁控制_公平锁实践技巧的详细内容,更多请关注php中文网其它相关文章!
每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号