在Java中,可以使用java.util.concurrent.locks.ReentrantLock類實現公平鎖
import java.util.concurrent.locks.ReentrantLock;
public class FairLockExample {
private final ReentrantLock fairLock = new ReentrantLock(true); // 使用公平鎖構造函數創建鎖
public void doSomething() {
fairLock.lock(); // 獲取鎖
try {
// 臨界區代碼
System.out.println(Thread.currentThread().getName() + " is in critical section.");
} finally {
fairLock.unlock(); // 釋放鎖
}
}
public static void main(String[] args) {
FairLockExample example = new FairLockExample();
// 創建兩個線程
Thread thread1 = new Thread(() -> {
for (int i = 0; i < 5; i++) {
example.doSomething();
}
}, "Thread-1");
Thread thread2 = new Thread(() -> {
for (int i = 0; i < 5; i++) {
example.doSomething();
}
}, "Thread-2");
// 啟動線程
thread1.start();
thread2.start();
}
}
在這個示例中,我們創建了一個名為FairLockExample的類,它包含一個使用公平鎖策略的ReentrantLock實例。當創建ReentrantLock對象時,我們將第二個參數設置為true,以啟用公平鎖策略。這意味著等待時間最長的線程將獲得鎖。
在doSomething方法中,我們使用fairLock.lock()獲取鎖,然后在finally塊中使用fairLock.unlock()釋放鎖。這樣可以確保鎖在臨界區代碼執行完畢后被正確釋放,避免死鎖。
在main方法中,我們創建了兩個線程并啟動它們。由于我們使用了公平鎖策略,因此等待時間最長的線程將獲得鎖,從而避免了線程饑餓問題。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。