1. 程式人生 > >AQS實現公平鎖和非公平鎖

AQS實現公平鎖和非公平鎖

rac readwrite post 原理 失敗 之前 有一個 class blog

https://www.cnblogs.com/chengdabelief/p/7493200.html

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獲取鎖

AQS實現公平鎖和非公平鎖