精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

從ReentrantLock的角度思考AQS

開發 前端
我們上一篇簡單介紹了AQS這個技術點,這一篇我們從ReentrantLock這個鎖的角度來分析AQS,幫助大家理解。

[[439467]]

我們上一篇簡單介紹了AQS這個技術點,這一篇我們從ReentrantLock這個鎖的角度來分析AQS,幫助大家理解

[[439468]]

首先,我們先看一下ReentrantLock的內部的抽象類Sync,這個是繼承于AQS的,重寫了其中的一些方法,我們會在下面源碼中解析,繼續往下看,記住這個Sync

我們知道這個鎖可以實現公平鎖和非公平鎖,我們來看下是如何實現的

  1. /** 
  2.     * Sync object for non-fair locks 
  3.     */ 
  4.    static final class NonfairSync extends Sync { 
  5.        private static final long serialVersionUID = 7316153563782823691L; 
  6.  
  7.        /** 
  8.         * Performs lock.  Try immediate barge, backing up to normal 
  9.         * acquire on failure. 
  10.         */ 
  11.        final void lock() { 
  12.            if (compareAndSetState(0, 1)) 
  13.                setExclusiveOwnerThread(Thread.currentThread()); 
  14.            else 
  15.                acquire(1); 
  16.         } 
  17.  
  18.        protected final boolean tryAcquire(int acquires) { 
  19.            return nonfairTryAcquire(acquires); 
  20.         } 
  21.  
  22.  
  23.    /** 
  24.     * Sync object for fair locks 
  25.     */ 
  26.    static final class FairSync extends Sync { 
  27.        private static final long serialVersionUID = -3000897897090466540L; 
  28.  
  29.        final void lock() { 
  30.             acquire(1); 
  31.         }} 

上面的是非公平鎖,下面的是公平鎖,默認的是非公平鎖,我們看下非公平鎖的實現是先通過CAS的方式去加鎖,加鎖成功之后就將當前線程設置為活躍的持有鎖的線程

  1. /** 
  2.      * The current owner of exclusive mode synchronization. 
  3.    */ 
  4.    private transient Thread exclusiveOwnerThread; 

失敗的話會執行acquire方法,OK,這里我們再看下公平鎖FairSync的lock方法的實現,這個公平鎖沒有像上面非公平鎖那樣判斷,而是直接調用了acquire方法

這里大家應該也懂了非公平鎖和公平鎖的真正區別了吧,就是非公平鎖的時候,線程來的時候會多一次直接嘗試加鎖,剩下的操作就是一樣了

OK,讓我們進去acquire方法看

看一下tryAcquire方法

可以看出,這里只是AQS的簡單實現,具體獲取鎖的實現方法是由各自的公平鎖和非公平鎖單獨實現的(以ReentrantLock為例)

如果該方法返回了True,則說明當前線程獲取鎖成功,就不用往后執行了;如果獲取失敗,就需要加入到等待隊列中。下面會詳細解釋線程是何時以及怎樣被加入進等待隊列中的。

OK,知道了這個我們就得看看ReentrantLock是如何實現tryAcquire方法的

老規矩,先看一下非公平鎖中的具體實現

大家看代碼應該也比較好理解,第一步先判斷state==0,這個0也就意味著這個共享資源處于空閑狀態,于是這里就會先嘗試去搶一下鎖,假如此時等待隊列中有等待線程,則就是等待線程中的第二個節點和這個新加入的這個線程去搶這個鎖了

為什么是第二個,因為第一個head節點存儲的永遠是占用鎖的線程節點Node

接下來就是判斷當前持有鎖的線程和當前線程是否是同一個,如果是同一個,則將state+1,這里就是ReentrantLock支持重入性的關鍵,到時候解鎖的時候也是通過減去這個state計數的

搶到鎖或者重入鎖,都會返回true,返回true,加鎖方法就直接加鎖了

如果既沒搶到鎖,又發現占用鎖的線程不是當前線程,則返回false,繼續執行

上面這是非公平鎖的tryAcquire方法,接下來咱再看這個公平鎖的tryAcquire方法

這個也是先判斷狀態是否為0,這個的==0之后的處理邏輯就很明了了,直接通過hasQueuedPredecessors方法判斷隊列中是否有等待的節點,如果沒有等待的節點,則直接通過CAS的方式進行判斷,然后就是把當前線程設置為活躍線程

如果有等待的節點,就會跳過CAS的判斷,緊接著會去判斷當前線程和持有鎖的線程是否是同一個線程,如果是同一個線程,還是進行計數+1,滿足可重入性

不是就返回false,此時tryAcquire方法返回false

此時,我們再把視角拉回到acquire方法

返回false之后,則會執行addWaiter方法和acquireQueued方法

這段代碼首先會創建一個和當前線程綁定的Node節點,Node為雙向鏈表。此時等待對內中的tail指針為空,直接調用enq(node)方法將當前線程加入等待隊列尾部:

第一遍循環時tail指針為空,進入if邏輯,使用CAS操作設置head指針,將head指向一個新創建的Node節點。

此時AQS中數據:

執行完成之后,head、tail、t都指向第一個Node元素。

接著執行第二遍循環,進入else邏輯,此時已經有了head節點,這里要操作的就是將線程二對應的Node節點掛到head節點后面。此時隊列中就有了兩個Node節點:

addWaiter()方法執行完后,會返回當前線程創建的節點信息。繼續往后執行acquireQueued(addWaiter(Node.EXCLUSIVE), arg)邏輯,此時傳入的參數為線程二對應的Node節點信息

acquireQueued()這個方法會先判斷當前傳入的Node對應的前置節點是否為head,如果是則嘗試加鎖。

加鎖成功過則將當前節點設置為head節點,然后空置之前的head節點,方便后續被垃圾回收掉。

如果加鎖失敗或者Node的前置節點不是head節點,就會通過shouldParkAfterFailedAcquire方法 將head節點的waitStatus變為了SIGNAL=-1,最后執行parkAndChecknIterrupt方法,調用LockSupport.park()掛起當前線程。

我們不能發現的一點,就是AQS的設計內部,包括ReentrantLock的設計內部。很多地方都會嘗試用CAS的方式去加鎖,就是因為在高速的運轉下,可能在幾行代碼的時間一個線程就已經用完鎖了,這樣可以最高效率的來利用資源

parkAndCheckInterrupt主要用于掛起當前線程,阻塞調用棧,返回當前線程的中斷狀態。

給大家看個這里的流程圖,圖片來源于網絡,覺得挺不錯

從上圖可以看出,跳出當前循環的條件是當“前置節點是頭結點,且當前線程獲取鎖成功”。

為了防止因死循環導致CPU資源被浪費,我們會判斷前置節點的狀態來決定是否要將當前線程掛起,具體掛起流程用流程圖表示如下(shouldParkAfterFailedAcquire流程):

acquireQueued中最后的finally中,如果失敗,則執行cancelAcquire

獲取當前節點的前驅節點,如果前驅節點的狀態是CANCELLED,那就一直往前遍歷,找到第一個waitStatus <= 0的節點,將找到的Pred節點和當前Node關聯,將當前Node設置為CANCELLED。

但是為什么所有的變化都是對Next指針進行了操作,而沒有對Prev指針進行操作呢?什么情況下會對Prev指針進行操作?

執行cancelAcquire的時候,當前節點的前置節點可能已經從隊列中出去了(已經執行過Try代碼塊中的shouldParkAfterFailedAcquire方法了),如果此時修改Prev指針,有可能會導致Prev指向另一個已經移除隊列的Node,因此這塊變化Prev指針不安全。

shouldParkAfterFailedAcquire方法中,會執行下面的代碼,其實就是在處理Prev指針。shouldParkAfterFailedAcquire是獲取鎖失敗的情況下才會執行,進入該方法后,說明共享資源已被獲取,當前節點之前的節點都不會出現變化,因此這個時候變更Prev指針比較安全。

  1. do { 
  2.   node.prev = pred = pred.prev; 
  3.  } while (pred.waitStatus > 0); 

解鎖

接下來再對解鎖的基本流程進行分析。由于ReentrantLock在解鎖的時候,并不區分公平鎖和非公平鎖,所以我們直接看解鎖的源碼:

點進來release之后發現實現還是在AQS框架中

在ReentrantLock里面的公平鎖和非公平鎖的父類Sync定義了可重入鎖的釋放鎖機制。

這個方法先去減少一次可重入次數,然后判斷當前線程是否是持有鎖的線程,如果不是,則直接拋出異常

接著判斷c==0,等于0代表當前的資源處于空閑狀態,便可以將當前獨占資源的線程設置為null,然后更新state

如果不等于0,這一步釋放獨占鎖的操作便會濾過,就是普通的重入鎖減少一次重入次數,就像是重入加鎖三次,執行這里之后只是變成2次而已,但是還是該線程持有該資源

總結

我們先是在非公平鎖和公平鎖的角度分別分析了加鎖的過程,得知非公平比公平鎖只是多了一個搶先加鎖的機會,但是如果搶不到鎖還是會執行和公平鎖相同的邏輯

中間我們分析了公平鎖和非公平鎖的優缺點,這個是面試熱點

然后我們還會發現代碼中很多地方都會嘗試用CAS的方式去搶占鎖,我們知道CPU的運行是很快的,這樣能夠保證資源釋放釋放能夠在第一時間被等待隊列中的線程搶到鎖

最后我們又分析了這個釋放鎖的過程,這個釋放鎖并沒有公平和非公平的區分,只是其中對于重入鎖進行了處理,就是上面最后一張圖的==0操作,因為我們上面分析了重入的道理也是對這個state進行累加得來的,所以這里只需要減一,然后判斷是否為0即可

0的時候就意味著此時資源處于空閑狀態,這個state是volatile的,保證了可見性

這篇只是一個籠統的分析,其實還有很多細節沒有分析到位,只能說AQS的設計很精妙,李老牛皮

 

責任編輯:姜華 來源: Java賊船
相關推薦

2023-04-14 08:39:01

AQS方法JDK5

2010-04-17 13:17:29

網絡安全管理策略web安全

2022-07-11 20:46:39

AQSJava

2020-11-16 08:11:32

ReentrantLo

2019-04-28 16:10:50

設計Redux前端

2015-05-05 11:04:31

CoreOS自動化運維

2015-10-12 10:07:36

數據藝術市場

2022-03-08 11:29:06

Linux進程系統

2010-07-09 10:13:42

UDP協議

2011-12-27 11:14:36

Java

2021-02-06 23:21:35

SaaS開發低代碼

2011-06-16 17:49:00

SEO

2024-01-12 07:38:38

AQS原理JUC

2009-02-13 11:25:58

華為移動無線商業周刊

2012-04-29 10:37:28

APP

2010-07-16 09:00:20

開源RedOffice紅旗2000

2013-12-11 21:48:38

OpenStack

2020-12-14 08:03:52

ArrayList面試源碼

2020-02-04 09:53:05

數據安全數據泄漏信息安全

2020-12-17 08:03:57

LinkedList面試源碼
點贊
收藏

51CTO技術棧公眾號

黄色录像二级片| 日韩大片一区二区| 狠狠狠综合7777久夜色撩人| 奇米精品一区二区三区四区| 久久最新资源网| av免费观看不卡| 欧美不卡高清一区二区三区| 亚洲免费看黄网站| 精品乱码一区| 一区二区三区黄色片| 亚洲国产高清一区二区三区| 色琪琪综合男人的天堂aⅴ视频| 无码人妻丰满熟妇区毛片蜜桃精品| 亚洲日本天堂| 一区二区三区在线视频免费观看| 免费成人看片网址| 国产成人免费看一级大黄| 久久国产一二区| 久久九九免费视频| 成人免费无遮挡无码黄漫视频| 国产精品毛片无码| 色婷婷久久久亚洲一区二区三区| 国产精品无码电影在线观看| 国产小视频在线| 成人免费观看视频| 成人深夜直播免费观看| 亚洲 欧美 中文字幕| 伊人久久亚洲影院| 久久激情视频免费观看| 国产精品成人无码免费| 亚洲精品亚洲人成在线观看| 日韩免费高清视频| 五月婷婷六月合| 亚洲天堂一区二区| 亚洲超丰满肉感bbw| 欧美h视频在线观看| 黄色的视频在线免费观看| k8久久久一区二区三区 | 久久久www成人免费无遮挡大片 | 夜夜春成人影院| 日韩欧美国产综合在线一区二区三区| 一本岛在线视频| 色婷婷综合久久久中字幕精品久久| 午夜免费久久看| 2021国产视频| 1区2区在线观看| ...中文天堂在线一区| 亚洲欧美久久久久一区二区三区| 精品成人一区二区三区免费视频| wwwwww.欧美系列| 国产欧美在线一区二区| 空姐吹箫视频大全| 粉嫩13p一区二区三区| 91久久精品一区二区别| av高清一区二区| 国产乱码精品1区2区3区| 国产日产久久高清欧美一区| 在线免费观看高清视频| 毛片不卡一区二区| 国产精品一区二区三区毛片淫片| 影音先锋国产资源| 久久99精品一区二区三区| 国产精品中文字幕久久久| 国产美女www爽爽爽| 青青青爽久久午夜综合久久午夜| 国产精品视频永久免费播放| 一级黄色片在线观看| 蜜桃视频免费观看一区| 成人精品在线观看| av中文字幕免费在线观看| 国产精品自拍av| 高清日韩一区| 日韩精品系列| 国产精品毛片a∨一区二区三区| 亚洲成人第一| mm1313亚洲国产精品美女| 一区二区三区.www| 91猫先生在线| 久久久久久久性潮| 欧美一级视频精品观看| 波多野结衣视频播放| 国产亚洲一区| 久久久久北条麻妃免费看| 玖玖爱免费视频| 亚洲免费影院| 国产一区红桃视频| 涩涩视频免费看| 中文字幕乱码久久午夜不卡| 影音先锋成人资源网站| 天堂中文最新版在线中文| 欧美三级视频在线观看| 三级网站免费看| 亚洲人挤奶视频| 久久精品国产96久久久香蕉| 中文在线观看免费网站| 日本sm残虐另类| 国产91aaa| av网站大全在线观看| 亚洲另类中文字| 欧美日韩中文在线视频| 日韩电影免费观看高清完整版在线观看| 欧美一级日韩免费不卡| 美女脱光内衣内裤| 欧美一区二区三区久久精品茉莉花| 欧美一级淫片aaaaaaa视频| 一级片视频播放| www久久精品| 日本中文字幕一级片| 午夜精品久久久久久久久久蜜桃| 日韩亚洲欧美一区| 国产毛片久久久久久久| 亚洲香蕉网站| 成人性生交大片免费看视频直播| 日韩一区二区三区中文字幕| 一区二区三区色| 男人添女人下面免费视频| 老司机凹凸av亚洲导航| 操人视频在线观看欧美| 18国产免费视频| av亚洲精华国产精华精| 特大黑人娇小亚洲女mp4| 韩国美女久久| 亚洲第一免费网站| 中文字幕电影av| 蜜臀久久99精品久久久久久9| 国产嫩草一区二区三区在线观看| caoporm免费视频在线| 日本韩国欧美国产| 国产精品伦子伦| 极品少妇一区二区三区| 91亚洲精品一区二区| 91在线直播| 在线观看视频91| 久久久久久久久免费看无码 | 亚洲国产成人va在线观看麻豆| 亚洲精品动态| 欧美一级高清免费播放| 熟妇高潮一区二区三区| 亚洲国产综合色| 俄罗斯女人裸体性做爰| 在线电影一区二区| 成人亚洲激情网| 国产素人视频在线观看| 欧美高清dvd| 日本 欧美 国产| 奇米影视7777精品一区二区| 亚洲精品久久区二区三区蜜桃臀 | 51精品视频一区二区三区| 亚洲一区二区自偷自拍| 日韩福利视频网| 午夜免费电影一区在线观看| 久久xxx视频| 中文字幕欧美精品在线| 一区二区国产欧美| 亚洲天堂成人网| www.偷拍.com| 亚洲天堂黄色| 久久99精品久久久久久水蜜桃| 国产资源在线观看入口av| 亚洲欧美在线免费观看| 香蕉污视频在线观看| 中文字幕不卡在线观看| 九九热精品国产| 欧美精品自拍| 久久一区二区精品| 欧美色片在线观看| 日韩中文字幕精品| 国产aⅴ爽av久久久久成人| 一区二区三区四区五区视频在线观看 | 岛国av在线网站| 亚洲视频网站在线观看| 亚洲一区二区三区网站| 亚洲另类色综合网站| 水蜜桃av无码| 日韩成人午夜精品| 亚洲av综合色区| 日韩高清三区| 国产女精品视频网站免费| av黄色在线| 精品视频久久久久久| 中文字幕91爱爱| 亚洲国产精品久久久久婷婷884 | 国产精品免费电影| 国产高清一区二区三区视频| 亚洲高清久久网| 国产情侣免费视频| 亚洲一区二区在线观看视频| 亚洲最大成人网站| 国内国产精品久久| 青青艹视频在线| 91亚洲人成网污www| 国产麻豆日韩| 欧美视频第一| 欧美性视频网站| 黄色精品免费看| 日韩精品高清在线观看| 国产精品视频第一页| 欧美午夜www高清视频| 国产黄a三级三级| 97国产精品videossex| 午夜剧场高清版免费观看| 99国产精品视频免费观看一公开| 亚洲三区在线观看| 群体交乱之放荡娇妻一区二区| 国产又爽又黄的激情精品视频| 精品人人视频| 久久福利视频导航| 国产福利小视频在线观看| 精品欧美久久久| 一级片视频网站| 91国在线观看| 国产欧美日韩另类| 亚洲激情网站免费观看| 伊人影院综合网| 91在线视频官网| 女教师高潮黄又色视频| 久久国产麻豆精品| 国产成人a亚洲精v品无码| 亚洲午夜精品久久久久久app| 亚洲欧洲国产日韩精品| 久久不见久久见国语| 国产视频在线观看一区| 国产成人免费视频网站视频社区| 国产精品wwww| 三级中文字幕在线观看| 欧美黄色性视频| 成人免费在线| 日韩视频永久免费观看| 97视频精彩视频在线观看| 亚洲色图第三页| 色视频在线观看免费| 亚洲国产精品999| 亚洲大尺度视频| 日韩一级片在线观看| 国产露脸91国语对白| 欧美嫩在线观看| 91av久久久| 欧美日韩亚洲综合在线| 中国精品一区二区| 在线视频欧美精品| 无码人妻一区二区三区免费| 色综合久久久久综合| 国产性生活视频| 一本大道av伊人久久综合| 草莓视频18免费观看| 一本色道久久加勒比精品| 成人午夜视频在线播放| 欧美性精品220| 日韩人妻精品中文字幕| 色婷婷精品大在线视频| 亚洲婷婷综合网| 91激情五月电影| 中文字幕在线网站| 欧美丰满少妇xxxbbb| 国产精品自偷自拍| 欧美精品一级二级| 97国产精品久久久| 日韩精品一区二区三区视频在线观看 | 国产最新精品精品你懂的| 成人日韩在线视频| 国产在线不卡一卡二卡三卡四卡| 善良的小姨在线| 成人h版在线观看| 亚洲区免费视频| 国产精品国产三级国产aⅴ原创| 国产极品美女在线| 亚洲综合在线观看视频| 全部毛片永久免费看| 欧美性生交大片免网| 中文字幕人妻精品一区| 7777精品伊人久久久大香线蕉经典版下载 | 韩国精品一区二区| 久久久无码人妻精品无码| 97久久人人超碰| 精品欧美一区二区久久久| 国产精品乱码久久久久久| 超碰手机在线观看| 精品美女永久免费视频| 精品乱码一区内射人妻无码| 欧美一区二区在线视频| 天堂av网在线| 丝袜美腿亚洲一区二区| 久久不射影院| 国产国产精品人在线视| 日韩中文字幕| 欧美日韩精品免费在线观看视频| 婷婷精品进入| 久久黄色片视频| 韩国三级在线一区| 中文成人无字幕乱码精品区| 国产精品二区一区二区aⅴ污介绍| 日本熟伦人妇xxxx| 欧美午夜在线一二页| 国产综合视频在线| 在线看日韩欧美| av成人影院在线| 成人激情免费在线| 亚洲成a人片77777在线播放| 国产女人18毛片| 免费观看一级特黄欧美大片| 毛茸茸free性熟hd| 亚洲欧洲日韩av| 国产主播第一页| 亚洲成人免费网站| 国内精品久久久久国产| 欧美一级片久久久久久久| 亚洲不卡在线| 一区二区三区四区视频在线观看| 国产日韩综合| 亚洲v在线观看| 17c精品麻豆一区二区免费| 日韩精品视频免费播放| 欧美一区二区三区免费大片 | 国产a级免费视频| 中文字幕日本精品| 国产精品专区免费| 国产精品久久久久av福利动漫| 天天天综合网| 我看黄色一级片| 久久亚洲春色中文字幕久久久| 精品一级少妇久久久久久久| 欧美一区二区三区四区五区| h视频在线观看免费| 91po在线观看91精品国产性色| 亚洲精品国产九九九| 日本一级淫片演员| 麻豆91在线播放| 粉嫩精品久久99综合一区| 欧美午夜精品久久久久久人妖 | 国v精品久久久网| 国产一区二区精彩视频| 欧美日韩精品二区第二页| 91精品专区| 国产精品免费久久久久久| 国产精品最新| av无码精品一区二区三区| 久久综合国产精品| 五月婷婷亚洲综合| 日韩成人中文字幕| 51精品在线| 精品国产一区二区三区麻豆小说 | 国产污在线观看| 亚洲欧洲性图库| 91丨九色丨蝌蚪丨对白| 日韩中文有码在线视频| 少妇高潮一区二区三区99| 少妇精品久久久久久久久久| 男女男精品视频| 情侣偷拍对白清晰饥渴难耐| 4hu四虎永久在线影院成人| 精精国产xxxx视频在线| 91免费的视频在线播放| 欧美日本一区| 亚洲视频 中文字幕| 偷窥少妇高潮呻吟av久久免费| 人操人视频在线观看| 国产精品美女av| 欧美顶级大胆免费视频| 日本一二三四区视频| 一区二区高清视频在线观看| 丰满肉肉bbwwbbww| 57pao国产精品一区| 国产一区日韩| 亚洲欧美偷拍另类| 亚洲最快最全在线视频| 性感美女一级片| 国产精品久久久久久婷婷天堂| 亚洲激情久久| 午夜视频在线观看国产| 91久久精品一区二区三区| 欧美黄色激情| 国产成人精品免费视频大全最热| 亚洲欧美清纯在线制服| 五月天免费网站| 日韩欧美第一区| 9i看片成人免费高清| 视频在线观看成人| 国产精品亚洲人在线观看| 国产成人在线观看网站| 在线播放日韩av| 综合成人在线| 麻豆av免费在线| 亚洲欧美乱综合| 亚洲AV午夜精品| 国产精品av网站| 午夜欧美精品| 这里只有久久精品| 日韩精品影音先锋| 老司机2019福利精品视频导航| 五月天男人天堂| 91小视频免费观看| 国产口爆吞精一区二区| 98视频在线噜噜噜国产| 日韩综合网站| av鲁丝一区鲁丝二区鲁丝三区| 欧美性生活久久| 97人澡人人添人人爽欧美| 国产91av视频在线观看| 91在线码无精品| 成人久久久精品国产乱码一区二区 |