AQS組件與鎖

併發工具類,鎖ReetrantLock等都是由Aqs實現

基本組件:LockSupport,part(),unPark(),阻塞和喚醒當前線程

CLH隊列鎖,大部分系統所用的鎖機制,雙向鏈表,每個節點線程都在循環檢查前一個節點線程是否釋放鎖

AQS是CHL的變體實現,公平鎖

ReetrantLock有靜態內部類sync實現了aqs抽象類,公平鎖進入先看閒趣節點有沒有釋放鎖,非公平鎖上來直接搶鎖,搶不到則進入隊列,一旦進入隊列則和公平鎖一樣

aqs模板方法模式

內部維護了一個state所狀態0-->1-->0

可以自己繼承Lock寫內部類sync同步器繼承aqs來實現自己的鎖,tryAcquire cas01 [排它獨佔鎖setExclusiveOwnerThread(Thread.currentThread)], tryRelease,遞歸會鎖死自己,不可重入

內部維護了一個NODE節點,用來保存線程隊列,裏面保存了上一節點和下一節點,獨佔欲非獨佔標識,傳播屬性標識,

一個線程站着鎖。另一個線程來了沒有獲取鎖,將線程封裝成NODE節點方法鏈表尾部,循環查看上一個節點的鎖狀態,

獲取兩次鎖失敗後進去調用LockSupport.part進入阻塞狀態,當別的線程調用release方法釋放鎖是找到下一個節點調用LockSupport.unPark方法喚醒下一個節點,

獲取獨佔鎖的流程

tryAcquireShared和tryReleaseShared共享同步類,read共享鎖,state數量扣減

 

Condition內部實現了一個等待隊列,await量線程打包成node節點,放入隊列,並用LockSupport.park進入阻塞狀態,被前一個線程喚醒後signal(全部喚醒是隊列中的線程循環全部喚醒)將阻塞隊列移動到同步隊列排隊獲取鎖

aqs是實現同步鎖的組件,是實現線程之間同步的規範,cas是對現在cpu原子比較賦值操作的循環調用

 

分佈式高併發可以先用本地鎖,搶到本地鎖再去搶分佈式鎖

可重入鎖,是將cas維護的state+1的累加操作,重入釋放一次扣減一次

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章