# ReentrantLock怎么指定為公平鎖
## 一、ReentrantLock簡介
`ReentrantLock`是Java并發包(`java.util.concurrent.locks`)中提供的可重入互斥鎖,它比`synchronized`關鍵字提供了更靈活的鎖控制機制。主要特性包括:
- 可重入性:同一個線程可以多次獲取同一把鎖
- 可中斷的鎖獲取
- 超時獲取鎖
- 公平性選擇(本文重點)
## 二、公平鎖與非公平鎖的區別
### 1. 非公平鎖(默認)
```java
// 默認構造方法創建的是非公平鎖
ReentrantLock lock = new ReentrantLock();
// 通過構造參數指定為公平鎖
ReentrantLock fairLock = new ReentrantLock(true);
// 傳入true參數創建公平鎖
ReentrantLock fairLock = new ReentrantLock(true);
查看ReentrantLock
構造方法:
public ReentrantLock(boolean fair) {
sync = fair ? new FairSync() : new NonfairSync();
}
公平鎖通過FairSync
內部類實現,其核心邏輯在tryAcquire()
方法中:
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;
}
}
// ...重入邏輯
}
public class FairLockExample {
private static final ReentrantLock fairLock = new ReentrantLock(true);
public static void main(String[] args) {
for (int i = 0; i < 5; i++) {
new Thread(() -> {
fairLock.lock();
try {
System.out.println(Thread.currentThread().getName() + "獲取鎖");
Thread.sleep(100);
} finally {
fairLock.unlock();
}
}, "Thread-" + i).start();
}
}
}
public class FairLockWithCondition {
private final ReentrantLock lock = new ReentrantLock(true);
private final Condition condition = lock.newCondition();
public void await() throws InterruptedException {
lock.lock();
try {
condition.await();
} finally {
lock.unlock();
}
}
public void signal() {
lock.lock();
try {
condition.signal();
} finally {
lock.unlock();
}
}
}
鎖類型 | 吞吐量(ops/ms) | 平均延遲(ms) |
---|---|---|
非公平鎖 | 15,632 | 0.12 |
公平鎖 | 9,847 | 0.21 |
使用公平鎖:
使用非公平鎖:
不是完全公平的,因為: - 操作系統線程調度本身存在不確定性 - 等待隊列中的線程被喚醒后仍需競爭CPU資源
ReentrantLock lock = new ReentrantLock(true);
System.out.println("是否是公平鎖:" + lock.isFair());
不可以,必須在構造時確定,沒有提供setter方法修改。
new ReentrantLock(true)
可創建公平鎖合理選擇鎖的公平策略,可以在保證業務需求的同時獲得最佳性能表現。 “`
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。