1. 程式人生 > >ReentrantLock之公平鎖與非公平鎖淺析

ReentrantLock之公平鎖與非公平鎖淺析

   在Java的ReentrantLock建構函式中提供了兩種鎖:建立公平鎖和非公平鎖(預設)。程式碼如下:

public ReentrantLock() {

       sync = new NonfairSync();

}

 public ReentrantLock(boolean fair) {
          sync = fair ? new FairSync() : new NonfairSync();
    }

在公平的鎖上,執行緒按照他們發出請求的順序獲取鎖,但在非公平鎖上,則允許‘插隊’:當一個執行緒請求非公平鎖時,如果在發出請求的同時該鎖變成可用狀態,那麼這個執行緒會跳過佇列中所有的等待執行緒而獲得鎖。     非公平的ReentrantLock 並不提倡 插隊行為,但是無法防止某個執行緒在合適的時候進行插隊。

在公平的鎖中,如果有另一個執行緒持有鎖或者有其他執行緒在等待佇列中等待這個所,那麼新發出的請求的執行緒將被放入到佇列中。而非公平鎖上,只有當鎖被某個執行緒持有時,新發出請求的執行緒才會被放入佇列中。

非公平鎖效能高於公平鎖效能的原因:

在恢復一個被掛起的執行緒與該執行緒真正執行之間存在著嚴重的延遲。

假設執行緒A持有一個鎖,並且執行緒B請求這個鎖。由於鎖被A持有,因此B將被掛起。當A釋放鎖時,B將被喚醒,因此B會再次嘗試獲取這個鎖。與此同時,如果執行緒C也請求這個鎖,那麼C很可能會在B被完全喚醒之前獲得、使用以及釋放這個鎖。這樣就是一種雙贏的局面:B獲得鎖的時刻並沒有推遲,C更早的獲得了鎖,並且吞吐量也提高了。

當持有鎖的時間相對較長或者請求鎖的平均時間間隔較長,應該使用公平鎖。在這些情況下,插隊帶來的吞吐量提升(當鎖處於可用狀態時,執行緒卻還處於被喚醒的過程中)可能不會出現。

相關推薦

Java重入Reentrantlock)原理,公平公平

一個 star spa void 模板 ont thread fin 模式 1、特點: 已獲取鎖的線程再次請求鎖,可以直接獲取。 2、實現: 自定義內部類 Sync,繼承 AbstarctQueuedSynchronizer : 2.1、獲取鎖:lock() a、公平鎖:

ReentrantLock原始碼公平公平

ReentrantLock類與Synchronized關鍵字的主要區別之一就是可以實現公平鎖和非公平鎖。我們看下ReentrantLock類是如果實現公平鎖與非公平鎖的。 1、非公平鎖的實現 ReentrantLock預設建構函式為非公平鎖(為什麼?因為非公平鎖的實現可以減少執行緒的切換

多執行緒 ReentrantLock公平公平

ReentrantLock 重入鎖的意思。重入的意思是任意執行緒再獲取到鎖後能夠再次獲取該鎖而不會被鎖阻塞。ReentrantLock 包含公平鎖和非公平鎖。 ReetrantLock 的建構函式中根據boolean值的不同  FairSync 公平同步器與非公平同步器 上

ReentrantLock公平公平淺析

   在Java的ReentrantLock建構函式中提供了兩種鎖:建立公平鎖和非公平鎖(預設)。程式碼如下: public ReentrantLock() {        sync = new

ReentrantLock——公平公平對比

/** * 公平鎖非公平鎖 */ @Test public void FairLockAndNotFairLockTest() throws Exception { ReentrantLock2 fairLock = new Reen

大白話聊聊Java併發面試問題公平公平是啥?【石杉的架構筆記】

歡迎關注個人公眾號:石杉的架構筆記(ID:shishan100) 週一至週五早8點半!精品技術文章準時送上! 一、寫在前面 上篇文章(大白話聊聊Java併發面試問題之談談你對AQS的理解?)聊了一下java併發包中的AQS的工作原理,也間接說明了ReentrantLock的工作原理。 這篇文章接著來聊一個話

java中ReentrantLock公平公平

大家都知道ReentrantLock是基於jdk層面實現的可重入鎖,使用的時候有公平鎖與非公平鎖之分,預設採用非公平鎖。那麼公平鎖與非公平鎖的機制有何區別呢?非公平鎖的機制為什麼會提高效能呢?       在這裡不討論兩種鎖的具體實現,只講其思想。        1、首先

Java併發程式設計獨佔公平公平比較

Java併發程式設計鎖之獨佔公平鎖與非公平鎖比較 公平鎖和非公平鎖理解: 在上一篇文章中,我們知道了非公平鎖。其實Java中還存在著公平鎖呢。公平二字怎麼理解呢?和我們現實理解是一樣的。大家去排隊本著先來先得到的原則,在排隊中,無論身份貴賤,一律平等對待。這是就是我們現實生活中的公平。大家都喜歡公平的。但是在

公平公平

bstr gets ado tex input ret trac 對象鎖 ctrl 前言 最近開始讀JDK源碼,所有心得準備總結成一個專欄,JDK Analysis系列的第一篇,就從萬眾矚目的ReentrantLock開始吧,而談到ReentrantLock,就不得不說AQ

公平公平源碼對比

exc 方式 native 非公平鎖 false 隊列 其它 釋放 null 語義: 1.公平鎖:每個線程在獲取鎖的時候,會先檢查該鎖維護的等待隊列,如果該隊列是空或者當前線程是第一個,則占有鎖,否則按照FIFO的原則,進入等待隊列,等待獲取鎖; 2.非公平鎖:當前線程在獲

多執行緒基礎學習十二:概念瞭解-重入、獨佔共享公平公平

前面瞭解了J.U.C中兩個重要的類或介面,其它的實現類都是以此為基礎的,現在還需要了解一下一些鎖的概念,有助於後面學習一些實現類或介面。 重入鎖 在併發中,無論是synchronized還是lock也好,內部都有重入的特性,而且特性的含義是一樣的。 重入(

JAVA多執行緒-Lock的使用(二)-公平公平

公平鎖與非公平鎖        鎖Lock分為:公平鎖和非公平鎖。        公平鎖:表示執行緒獲取鎖的順序是按照執行緒加鎖的順序來分配的,即先來先得的FIFO先進先出順序。        非公平

“全棧2019”Java多線程第二十八章:公平公平詳解

鏈接 分鐘 學習計劃 語言 bubuko tell alt 圖片 tel 難度 初級 學習時間 10分鐘 適合人群 零基礎 開發語言 Java 開發環境 JDK v11 IntelliJ IDEA v2018.3 文章原文鏈接 “全棧2019”Java多線程第二十八章:

十四、併發程式設計ReentrantLock公平公平原理詳解

一、簡介 Java語言中有許多原生執行緒安全的資料結構,比如ArrayBlockingQueue、CopyOnWriteArrayList、LinkedBlockingQueue,它們執行緒安全的實現方式並非通過synchronized關鍵字,而是通過java.util.concurre

死磕 java同步系列ReentrantLock原始碼解析(一)——公平公平

問題 (1)重入鎖是什麼? (2)ReentrantLock如何實現重入鎖? (3)ReentrantLock為什麼預設是非公平模式? (4)ReentrantLock除了可重入還有哪些特性? 簡介 Reentrant = Re + entrant,Re是重複、又、再的意思,entrant是enter的名詞或

深入分析ReentrantLock公平公平的區別

在ReentrantLock中包含了公平鎖和非公平鎖兩種鎖,通過檢視原始碼可以看到這兩種鎖都是繼承自Sync,而Sync又繼承自AbstractQueuedSynchronizer,而AbstractQueuedSynchronizer又繼承自AbstractOwnableSynchronizer,下面是類的

深圳某小公司面試題:AQS是什麼?公平公平ReentrantLock

![](https://tva1.sinaimg.cn/large/008eGmZEly1gmpoiaqg44j30ku112n2s.jpg) ![](https://tva1.sinaimg.cn/large/008eGmZEly1gmpoi8s0roj30ku112gq6.jpg) ![](https

AQS實現公平公平

rac readwrite post 原理 失敗 之前 有一個 class blog https://www.cnblogs.com/chengdabelief/p/7493200.html AQS(AbstractQueuedSynchronizer類)是一個用來構建

多線程學習 公平公平

ava print anr 控制臺 finall 個數 rac 每一個 count() 公平與非公平鎖:鎖lock分為 公平鎖和非公平鎖,公平鎖表示現場獲取鎖的順序是按照線程加鎖的順序來分配的, 即先來先得的FIFO先進先出順序。而非公平鎖就是一種獲取鎖的搶占機制,是隨

Java中的公平公平實現詳解

轉載自:https://blog.csdn.net/qyp199312/article/details/70598480#reentrantlock鎖的實現分析   前言 ReentrantLock的可重入性分析 synchronized的可重入性 ReentrantLock的可重