aqs(abstractqueuedsynchronizer類)是乙個用來構建鎖和同步器的框架,它在內部定義了乙個int state變數,用來表示同步狀態.在lock包中的相關鎖(常用的有reentrantlock、 readwritelock)都是基於aqs來構建.然而這些鎖都沒有直接來繼承aqs,而是定義了乙個sync類去繼承aqs.那麼為什麼要這樣呢?because:鎖面向的是使用使用者,而同步器面向的則是執行緒控制,那麼在鎖的實現中聚合同步器而不是直接繼承aqs就可以很好的隔離二者所關注的事情.
基於aqs的鎖(比如reentrantlock)原理大體是這樣:
有乙個state變數,初始值為0,假設當前執行緒為a,每當a獲取一次鎖,status++. 釋放一次,status--.鎖會記錄當前持有的執行緒。
當a執行緒擁有鎖的時候,status>0. b執行緒嘗試獲取鎖的時候會對這個status有乙個cas(0,1)的操作,嘗試幾次失敗後就掛起執行緒,進入乙個等待佇列。
如果a執行緒恰好釋放,--status==0, a執行緒會去喚醒等待佇列中第乙個執行緒,即剛剛進入等待佇列的b執行緒,b執行緒被喚醒之後回去檢查這個status的值,嘗試cas(0,1),而如果這時恰好c執行緒也嘗試去爭搶這把鎖
非公平鎖實現:
c直接嘗試對這個status cas(0,1)操作,並成功改變了status的值,b執行緒獲取鎖失敗,再次掛起,這就是非公平鎖,b在c之前嘗試獲取鎖,而最終是c搶到了鎖。
公平鎖:
c發現有執行緒在等待佇列,直接將自己進入等待佇列並掛起,b獲取鎖
公平鎖和非公平鎖
公平鎖和非公平鎖的不同是發生在乙個新的執行緒搶占乙個鎖的情況下。1.對於非公平鎖,當乙個新的執行緒想要得到乙個鎖,而這時鎖恰好沒有被別的執行緒占有,那麼這時候這個新的執行緒就可以無視其他執行緒在等待佇列中的排隊,而直接獲取這個鎖,而且不用先加入等待佇列。2,公平鎖,就是乙個新的執行緒想要得到乙個鎖,...
公平鎖和非公平鎖
所謂公平鎖指的是哪個執行緒先執行,那就可以先得到鎖。非公平鎖是不管執行緒是否是先執行,上來就直接嘗試占有鎖,如果嘗試失敗,就再採用類似公平鎖那種方式。我們看下reentrantlock 類的原始碼 公平鎖 protected final boolean tryacquire int acquires...
公平鎖和非公平鎖
三 reentrantlock非公平鎖 三 reentrantlock公平鎖 有個小夥伴最近諮詢我,前段時間他被面試官問了synchronized是公平鎖還是非公平鎖?當時就矇圈了,最後面試結果可想而知,今天我們就用乙個通俗的案例加上 來說明公平鎖和非公平鎖。其實公平鎖這個概念是juc工具包才有的,...