更新時間:2022-08-16 07:39:26 來源:動力節點 瀏覽1259次
從字面上看,其實很簡單。公平意味著每個人都排隊買票。不公平是指有人開了超級VIP,跳線。所以在多線程中,有公平鎖和不公平鎖。如何理解?
公平鎖:多個線程按照申請鎖的先后順序獲得鎖,所有線程都在隊列中排隊,保證了隊列中的第一個先拿到鎖。
優點:所有線程都可以獲得資源,不會在隊列中餓死。
缺點:吞吐量會下降很多,除了隊列中的第一個線程外,其他線程都會被阻塞,cpu喚醒阻塞線程的開銷會很大。
不公平鎖:多個線程不按照申請鎖的順序獲取鎖,而是直接嘗試同時獲取鎖(插入隊列中)。如果獲取失敗(插入失敗),則進入隊列等待(如果排隊失敗),如果可以獲取(成功跳轉隊列),則直接獲取鎖。
優點:可以減少CPU喚醒線程的開銷,整體吞吐效率會更高,而且CPU不必喚醒所有線程,會減少被調用的線程數。
缺點:可能會導致隊列中排隊的線程無法獲取鎖或獲取鎖時間過長,餓死。
在Java多線程并發操作中,我們操作鎖大部分時候都是基于Sync本身實現的,但是Sync本身是ReentrantLock本身的一個內部類,而Sync本身繼
從字面上看,其實很簡單。公平意味著每個人都排隊買票。不公平是指有人開了超級VIP,跳線。所以在多線程中,有公平鎖和不公平鎖。如何理解?
公平鎖:多個線程按照申請鎖的先后順序獲得鎖,所有線程都在隊列中排隊,保證了隊列中的第一個先拿到鎖。
優點:所有線程都可以獲得資源,不會在隊列中餓死。
缺點:吞吐量會下降很多,除了隊列中的第一個線程外,其他線程都會被阻塞,cpu喚醒阻塞線程的開銷會很大。
不公平鎖:多個線程不按照申請鎖的順序獲取鎖,而是直接嘗試同時獲取鎖(插入隊列中)。如果獲取失敗(插入失敗),則進入隊列等待(如果排隊失敗),如果可以獲取(成功跳轉隊列),則直接獲取鎖。
優點:可以減少CPU喚醒線程的開銷,整體吞吐效率會更高,而且CPU不必喚醒所有線程,會減少被調用的線程數。
缺點:可能會導致隊列中排隊的線程無法獲取鎖或獲取鎖時間過長,餓死。
在Java多線程并發操作中,我們操作鎖大部分時候都是基于Sync本身實現的,但是Sync本身是ReentrantLock本身的一個內部類,而Sync本身繼承了AbstractQueuedSynchronizer,如圖:
那么我們如何實現公平鎖和不公平鎖呢?我們以買票為例,通過 ReentrantLock 進行說明:
公共類 FairLocked 實現 Runnable {
私人 int 座位號 = 100;
/**
* 公平鎖實現ReentrantLock在構造方法中設置為true:代表公平鎖
*
* 設置為false:表示不公平鎖默認也是不公平鎖
*
*/
/** 私有 ReentrantLock 鎖 = new ReentrantLock(true); */
/** 私有 ReentrantLock 鎖 = new ReentrantLock(false); */
私有 ReentrantLock 鎖 = new ReentrantLock();
@Override
公共無效運行(){
而(真){
嘗試 {
lock.lock();
如果(座位號> 0){
線程.sleep(100);
- 座位號;
System.out.println(Thread.currentThread().getName() + "占用1個座位,還有一個座位" + seatNumber + "座位");
} 別的 {
System.out.println(Thread.currentThread().getName() + ": 不好意思,票賣完了!");
休息;
}
} 捕捉(InterruptedException e){
e.printStackTrace();
} 最后 {
lock.unlock();
}
}
}
公共靜態無效主要(字符串[]參數){
FairLocked rlbr = new FairLocked();
線程 t1 = new Thread(rlbr, "A window");
線程 t2 = new Thread(rlbr, "B window");
t1.start();
t2.start();
}
}
需要注意的是,默認情況下是不公平的。如果你想要一個公平的鎖,你必須將它設置為 true。因此,查看上面的輸出,可以看到 A 線程和 B 線程之間存在資源爭用(跳線)。這是一個不公平的鎖。我們設置為true看看效果如何:
可以看出AB線程是非常有序的,也就是排隊執行!如果大家想了解更多相關知識,可以關注動力節點的Java多線程編程,里面有更豐富的知識等著大家去學習,希望對大家能夠有所幫助。
0基礎 0學費 15天面授
有基礎 直達就業
業余時間 高薪轉行
工作1~3年,加薪神器
工作3~5年,晉升架構
提交申請后,顧問老師會電話與您溝通安排學習