Java的AQS基本原理詳細(xì)分析
AQS基本原理
AQS是Abstract Queued Synchronizer的簡(jiǎn)稱(chēng)。AQS提供了一種實(shí)現(xiàn)阻塞鎖和一系列依賴(lài)FIFO等待隊(duì)列的同步器的框架。
從使用層面來(lái)說(shuō),AQS的功能分為兩種:獨(dú)占和共享。
- 獨(dú)占鎖,每次只能有一個(gè)線(xiàn)程持有鎖,比如前面給大家演示的ReentrantLock就是以獨(dú)占方式實(shí)現(xiàn)的互斥鎖;
- 共享鎖,允許多個(gè)線(xiàn)程同時(shí)獲取鎖,并發(fā)訪問(wèn)共享資源,比如ReentrantReadWriteLock。
AQS內(nèi)部有以下幾個(gè)重要的數(shù)據(jù)結(jié)構(gòu):
- state變量,記錄鎖定狀態(tài),默認(rèn)0
- 加鎖線(xiàn)程變量,記錄當(dāng)前持有鎖的是哪個(gè)線(xiàn)程,默認(rèn)null
- 線(xiàn)程等待隊(duì)列
以ReentrantLock為例,加鎖代碼如下:
ReentrantLock lock = new ReentrantLock(); lock.lock(); //------業(yè)務(wù)邏輯------- ....... //-------------------------- lock.unlock();
例如線(xiàn)程1和線(xiàn)程2進(jìn)行加鎖操作,線(xiàn)程1先獲得鎖,AQS會(huì)將state置為1,并且加鎖線(xiàn)程變量記錄為線(xiàn)程1。線(xiàn)程2由于沒(méi)有獲得鎖,會(huì)被AQS放到線(xiàn)程等待隊(duì)列中進(jìn)行等待。
ReentrantLock翻譯成中文是可重入鎖,從名字就可知它和synchronized關(guān)鍵字一樣是可重入的。因?yàn)橛幸粋€(gè)加鎖線(xiàn)程變量當(dāng)前記錄了持有鎖的是哪個(gè)線(xiàn)程,ReentrantLock再次加鎖時(shí),是可以成功的,相應(yīng)的state變量也會(huì)加1。和synchronized關(guān)鍵字一樣,有一次加鎖操作就必須對(duì)應(yīng)一次解鎖操作,解鎖一次,state變量會(huì)減1。
當(dāng)線(xiàn)程1執(zhí)行完成,所有鎖定操作都對(duì)應(yīng)執(zhí)行了解鎖操作后,state變量為0,并且加鎖線(xiàn)程變量被置為null。此時(shí)會(huì)喚醒線(xiàn)程等待隊(duì)列中的第一個(gè)線(xiàn)程(線(xiàn)程2)去嘗試獲得鎖了。

但是如果此時(shí)恰好有一個(gè)新的線(xiàn)程3搶在線(xiàn)程2之前獲得了鎖,那么線(xiàn)程2只能繼續(xù)等待,這很不公平呀!而ReentrantLock默認(rèn)的就是不公平鎖。如果希望獲得的是公平鎖,新來(lái)的線(xiàn)程必須在線(xiàn)程等待隊(duì)列中排隊(duì)等待,也很簡(jiǎn)單,只需要構(gòu)造ReentrantLock對(duì)象時(shí),指定true的參數(shù)即可。
ReentrantLock lock = new ReentrantLock(true);
到此這篇關(guān)于Java的AQS基本原理詳細(xì)分析的文章就介紹到這了,更多相關(guān)AQS基本原理內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
SpringBoot隨機(jī)數(shù)設(shè)置及參數(shù)間引用的操作步驟
在Spring Boot配置文件中設(shè)置屬性時(shí),除了可以像前面示例中顯示的配置屬性值外,還可以使用隨機(jī)值和參數(shù)間引用對(duì)屬性值進(jìn)行設(shè)置。下面給大家介紹SpringBoot參數(shù)間引用隨機(jī)數(shù)設(shè)置的操作步驟,感興趣的朋友一起看看吧2021-06-06
使用通過(guò)ARP類(lèi)似P2P終結(jié)者實(shí)現(xiàn)數(shù)據(jù)封包
目前網(wǎng)絡(luò)上類(lèi)似P2P終結(jié)者這類(lèi)軟件,主要都是基于ARP欺騙實(shí)現(xiàn)的,網(wǎng)絡(luò)上到處都有關(guān)于ARP的介紹,不過(guò)為了本文讀者不需要再去查找,我就在這里大概講解一下2012-12-12
SpringBoot中@MessageMapping注解的原理及使用詳解
這篇文章主要介紹了SpringBoot中@MessageMapping注解的原理及使用詳解,@MessageMapping注解是Spring Boot提供的一個(gè)重要的注解之一,它可以幫助我們處理WebSocket消息,需要的朋友可以參考下2023-07-07
java實(shí)現(xiàn)哈夫曼壓縮的實(shí)例
這篇文章主要介紹了java實(shí)現(xiàn)哈夫曼壓縮的實(shí)例的相關(guān)資料,需要的朋友可以參考下2017-07-07
Mybatis配置之<properties>屬性配置元素解析
這篇文章主要介紹了Mybatis配置之<properties>屬性配置元素解析,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-07-07
JavaWeb學(xué)習(xí)過(guò)程之MVC查詢(xún)模式詳解
這篇文章主要介紹了JavaWeb學(xué)習(xí)過(guò)程之MVC查詢(xún)模式詳解的相關(guān)資料,非常不錯(cuò),具有參考借鑒價(jià)值,需要的朋友可以參考下2016-09-09

