真的理解公平鎖和非公平鎖嘛?

2021-09-13 18:58:04 字數 1669 閱讀 3556

之前一直對公平鎖和非公平鎖的概念不是特別清楚,簡單理解為只要當前資源被加鎖,之後的請求都會擱置到佇列中公平鎖就是嚴格按照fifo(先進先出)的規矩辦事。非公平鎖就是不遵守這個先進先出的規矩,惡性競爭資源。在看aqs(abstractqueuedsyncronizer)的原始碼中打破這種不太準確的認知.

接下來我會用reentrantlock的原始碼配合著闡述我理解的公平鎖和非公平鎖。

公平鎖: fairsync,就是當前資源被加鎖後,其他所有請求執行緒按照請求的先後順序擱置到queue中,當鎖被釋放放掉,然後嚴格的按照先進先出的原則乙個乙個加鎖。

就比如生活中去超市購物後買單,只有乙個收銀台,這個收銀台也只能服務乙個顧客。當買單的人特別多的時候,大家就需要按照先來後到排隊買單。

static final class fairsync extends sync 

protected final boolean tryacquire(int acquires)

}//如果state!=0,但是排它鎖的擁有者就是當前執行緒,這個時候就是可重入鎖

else if (current == getexclusiveownerthread())

return false;

}}

其實這裡就定好排隊買單的規矩,這段原始碼還額外看到了可重入鎖的原理。但是我們的重點是公平鎖,所**以我們接著看原始碼如何保證先進先出的排隊順序 hasqueuedpredecessors()**這裡大家可以把node理解成乙個thread的封裝。

public final boolean hasqueuedpredecessors()
這段**就是收銀員得確定下你是不是排在最前面的買單客戶,這樣就保證了獲取鎖的公平性!

非公平鎖:nonfairsync 非公平的意思就是管你三七二十一,我先嘗試給共享資源加鎖,如果加鎖成功就阻塞其他執行緒(因為其他執行緒都在佇列中排隊,這個時候就特別的霸道而顯得不公平),如果是共享資源上已經被加鎖了,這個時候在進入佇列的時候還要再判斷下資源有沒有被釋放掉能不能加鎖,兩次嘗試加鎖都失敗再霸道也沒用了,就只能老老實實去佇列尾部排隊!

還是去超市購物後買單,只有乙個收銀台,這個收銀台也只能服務乙個顧客。當買單的人特別多,大家都排著隊等著。這個時候來了個壯漢,仗著自己高大枉顧排隊的遊戲規則,直接跑到收銀台看有沒有人正在買單,如果沒有人正在買單就直接插隊買單。如果看了兩眼還是有人正在買單,那就規規矩矩到隊尾排隊。

static final class nonfairsync extends sync 

protected final boolean tryacquire(int acquires)

}

非公平tryacquire()這個方法和公平鎖的tryacquire()大同小異,只有乙個地方不一樣

final boolean nonfairtryacquire(int acquires) 

}//這裡可重入鎖的原理,跟公平鎖一樣

else if (current == getexclusiveownerthread())

return false;

}

好了,到了這裡相信公平鎖和非公平鎖應該有點明白了,不會像我之前一樣理解錯誤了!

公平鎖和非公平鎖

公平鎖和非公平鎖的不同是發生在乙個新的執行緒搶占乙個鎖的情況下。1.對於非公平鎖,當乙個新的執行緒想要得到乙個鎖,而這時鎖恰好沒有被別的執行緒占有,那麼這時候這個新的執行緒就可以無視其他執行緒在等待佇列中的排隊,而直接獲取這個鎖,而且不用先加入等待佇列。2,公平鎖,就是乙個新的執行緒想要得到乙個鎖,...

公平鎖和非公平鎖

所謂公平鎖指的是哪個執行緒先執行,那就可以先得到鎖。非公平鎖是不管執行緒是否是先執行,上來就直接嘗試占有鎖,如果嘗試失敗,就再採用類似公平鎖那種方式。我們看下reentrantlock 類的原始碼 公平鎖 protected final boolean tryacquire int acquires...

公平鎖和非公平鎖

三 reentrantlock非公平鎖 三 reentrantlock公平鎖 有個小夥伴最近諮詢我,前段時間他被面試官問了synchronized是公平鎖還是非公平鎖?當時就矇圈了,最後面試結果可想而知,今天我們就用乙個通俗的案例加上 來說明公平鎖和非公平鎖。其實公平鎖這個概念是juc工具包才有的,...