java中ReentrantLock實(shí)現(xiàn)公平鎖和非公平鎖
在 Java 里,公平鎖和非公平鎖是多線程編程中用于同步的兩種鎖機(jī)制,它們的主要差異在于獲取鎖的順序規(guī)則。下面是對(duì)二者的詳細(xì)介紹:
公平鎖
公平鎖遵循 “先來(lái)先服務(wù)” 原則,也就是線程獲取鎖的順序和請(qǐng)求鎖的順序一致。先請(qǐng)求鎖的線程會(huì)優(yōu)先獲得鎖,這樣可以保證每個(gè)線程都有公平的機(jī)會(huì)獲取鎖,避免某個(gè)線程長(zhǎng)時(shí)間等待。
不過(guò),公平鎖在實(shí)現(xiàn)公平性時(shí)會(huì)增加額外的開(kāi)銷,因?yàn)樾枰S護(hù)一個(gè)有序的等待隊(duì)列。當(dāng)一個(gè)線程釋放鎖后,會(huì)從隊(duì)列頭部選取下一個(gè)線程來(lái)獲取鎖。
非公平鎖
非公平鎖不保證線程獲取鎖的順序和請(qǐng)求鎖的順序一致。當(dāng)鎖被釋放時(shí),任何等待的線程都有機(jī)會(huì)獲取鎖,而不考慮其請(qǐng)求的先后順序。
非公平鎖可能會(huì)讓某些線程先于等待時(shí)間長(zhǎng)的線程獲取鎖,從而產(chǎn)生 “饑餓” 現(xiàn)象,即部分線程長(zhǎng)時(shí)間得不到鎖。但非公平鎖的性能通常比公平鎖要好,因?yàn)樗鼫p少了線程上下文切換和等待隊(duì)列管理的開(kāi)銷。
實(shí)現(xiàn)公平鎖和非公平鎖
在創(chuàng)建ReentrantLock時(shí)可以指定true或者false在指定公平或者非公平鎖(ReentrantLock和Synchronized關(guān)鍵字默認(rèn)是非公平鎖),像下面這樣
// 創(chuàng)建公平鎖 Lock fairLock = new ReentrantLock(true); // 創(chuàng)建非公平鎖 Lock unfairLock = new ReentrantLock(false);
如下是測(cè)試ReentrantLock實(shí)現(xiàn)公平鎖和非公平鎖的代碼
class Worker implements Runnable {
private final Lock lock;
private final String name;
public Worker(Lock lock, String name) {
this.lock = lock;
this.name = name;
}
@Override
public void run() {
for (int i = 0; i < 3; i++) {
lock.lock();
try {
System.out.println(name + " 獲得鎖,正在執(zhí)行任務(wù) " + i);
Thread.sleep(100);
} catch (InterruptedException e) {
e.printStackTrace();
} finally {
lock.unlock();
System.out.println(name + " 釋放鎖");
}
}
}
}
public class FairAndUnFair {
public static void main(String[] args) {
// 創(chuàng)建公平鎖
Lock fairLock = new ReentrantLock(true);
// 創(chuàng)建非公平鎖
Lock unfairLock = new ReentrantLock(false);
// 使用公平鎖
System.out.println("使用公平鎖:");
Thread t1 = new Thread(new Worker(fairLock, "線程1"));
Thread t2 = new Thread(new Worker(fairLock, "線程2"));
t1.start();
t2.start();
try {
t1.join();
t2.join();
} catch (InterruptedException e) {
e.printStackTrace();
}
// 使用非公平鎖
System.out.println("\n使用非公平鎖:");
t1 = new Thread(new Worker(unfairLock, "線程1"));
t2 = new Thread(new Worker(unfairLock, "線程2"));
t1.start();
t2.start();
}
}
在這個(gè)示例中,ReentrantLock構(gòu)造函數(shù)的參數(shù)true表示創(chuàng)建公平鎖,false表示創(chuàng)建非公平鎖。
適用場(chǎng)景
- 公平鎖:適用于對(duì)公平性要求較高的場(chǎng)景,如任務(wù)調(diào)度系統(tǒng),需要保證每個(gè)任務(wù)都能按順序執(zhí)行。
- 非公平鎖:適用于對(duì)性能要求較高,且對(duì)公平性要求較低的場(chǎng)景,如高并發(fā)的緩存系統(tǒng)。
到此這篇關(guān)于java中ReentrantLock實(shí)現(xiàn)公平鎖和非公平鎖的文章就介紹到這了,更多相關(guān)java ReentrantLock公平鎖和非公平鎖內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
C/C++中的struct結(jié)構(gòu)體詳細(xì)解讀
這篇文章主要介紹了C/C++中的struct結(jié)構(gòu)體詳細(xì)解讀,結(jié)構(gòu)體是由一批數(shù)據(jù)組合而成的結(jié)構(gòu)型數(shù)據(jù),組成結(jié)構(gòu)型數(shù)據(jù)的每個(gè)數(shù)據(jù)稱為結(jié)構(gòu)型數(shù)據(jù)的“成員”,其描述了一塊內(nèi)存區(qū)間的大小及意義,需要的朋友可以參考下2023-10-10
maven如何在tomcat8中實(shí)現(xiàn)自動(dòng)部署
本篇文章主要介紹了maven如何在tomcat8中實(shí)現(xiàn)自動(dòng)部署,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2017-10-10

