關(guān)于AbstractQueuedSynchronizer
JDK1.5之后引入了并發(fā)包java.util.concurrent,大大提高了Java程序的并發(fā)性能。關(guān)于java.util.concurrent包我總結(jié)如下:
AbstractQueuedSynchronizer是并發(fā)類諸如ReentrantLock、CountDownLatch、Semphore的核心
CAS算法是AbstractQueuedSynchronizer的核心
可以說AbstractQueuedSynchronizer是并發(fā)類的重中之重。其實(shí)之前在ReentrantLock實(shí)現(xiàn)原理深入探究一文中已經(jīng)有結(jié)合ReentrantLock詳細(xì)解讀過AbstractQueuedSynchronizer,但限于當(dāng)時(shí)水平原因,回看一年半前的此文,感覺對于AbstractQueuedSynchronizer的解讀理解還不夠深,因此這里更新一篇文章,再次解讀AbstractQueuedSynchronizer的數(shù)據(jù)結(jié)構(gòu)即相關(guān)源碼實(shí)現(xiàn),本文基于JDK1.7版本。
AbstactQueuedSynchronizer的基本數(shù)據(jù)結(jié)構(gòu)
AbstractQueuedSynchronizer的基本數(shù)據(jù)結(jié)構(gòu)為Node,關(guān)于Node,JDK作者寫了詳細(xì)的注釋,這里我大致總結(jié)幾點(diǎn):
AbstractQueuedSynchronizer的等待隊(duì)列是CLH隊(duì)列的變種,CLH隊(duì)列通常用于自旋鎖,AbstractQueuedSynchronizer的等待隊(duì)列用于阻塞同步器
每個(gè)節(jié)點(diǎn)中持有一個(gè)名為"status"的字段用于是否一條線程應(yīng)當(dāng)阻塞的追蹤,但是status字段并不保證加鎖
一條線程如果它處于隊(duì)列的頭,那么他會(huì)嘗試去acquire,但是成為頭并不保證成功,它只是有權(quán)利去競爭
要進(jìn)入隊(duì)列,你只需要自動(dòng)將它拼接在隊(duì)列尾部即可;要從隊(duì)列中移除,你只需要設(shè)置header字段
延伸閱讀
- ssh框架 2016-09-30
- 阿里移動(dòng)安全 [無線安全]玩轉(zhuǎn)無線電——不安全的藍(lán)牙鎖 2017-07-26
- 消息隊(duì)列NetMQ 原理分析4-Socket、Session、Option和Pipe 2024-03-26
- Selective Search for Object Recognition 論文筆記【圖片目標(biāo)分割】 2017-07-26
- 詞向量-LRWE模型-更好地識(shí)別反義詞同義詞 2017-07-26
- 從棧不平衡問題 理解 calling convention 2017-07-26
- php imagemagick 處理 圖片剪切、壓縮、合并、插入文本、背景色透明 2017-07-26
- Swift實(shí)現(xiàn)JSON轉(zhuǎn)Model - HandyJSON使用講解 2017-07-26
- 阿里移動(dòng)安全 Android端惡意鎖屏勒索應(yīng)用分析 2017-07-26
- 集合結(jié)合數(shù)據(jù)結(jié)構(gòu)來看看(二) 2017-07-26
