成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

重大發(fā)現(xiàn),AQS加鎖機制竟然跟Synchronized有驚人的相似

開發(fā) 前端
AQS跟Synchronized的加鎖流程是一樣的,都是通過同步隊列和條件隊列實現(xiàn)的,阻塞狀態(tài)的線程被放到同步隊列中,等待狀態(tài)的線程被放到條件隊列中,從條件隊列喚醒的線程又被轉(zhuǎn)移到同步隊列末尾,一塊競爭鎖。

在并發(fā)多線程的情況下,為了保證數(shù)據(jù)安全性,一般我們會對數(shù)據(jù)進行加鎖,通常使用Synchronized或者ReentrantLock同步鎖。Synchronized是基于JVM實現(xiàn),而ReentrantLock是基于Java代碼層面實現(xiàn)的,底層是繼承的AQS。

AQS全稱**AbstractQueuedSynchronizer**,即抽象隊列同步器,是一種用來構(gòu)建鎖和同步器的框架。

我們常見的并發(fā)鎖ReentrantLock、CountDownLatch、Semaphore、CyclicBarrier都是基于AQS實現(xiàn)的,所以說不懂AQS實現(xiàn)原理的,就不能說了解Java鎖。

當(dāng)我仔細研究AQS底層加鎖原理,發(fā)現(xiàn)竟然跟Synchronized加鎖原理有驚人的相似。讓我突然想到一句名言,記不清怎么說了,意思是框架底層原理很相似,大家多學(xué)習(xí)底層原理。

Synchronized的加鎖流程在前幾篇文章已經(jīng)詳細講過,沒看過一塊再溫習(xí)一下。

1. Synchronized加鎖流程

我們先想一下Synchronized的加鎖需求,如果讓你設(shè)計Synchronized的對象鎖存儲結(jié)構(gòu),該怎么設(shè)計?

  • 多個線程執(zhí)行到Synchronized代碼塊,只有一個線程獲取鎖,然后執(zhí)行同步代碼塊(需要記錄哪個線程獲取了對象鎖)。
  • 其他線程被阻塞(被阻塞的線程,是不是可以用鏈表設(shè)計個阻塞隊列?)
  • 持有鎖的線程調(diào)用wait方法,釋放鎖,等待被喚醒(等待的線程,是不是可以用鏈表設(shè)計個等待隊列?)。
  • 被阻塞的線程開始競爭鎖
  • 調(diào)用notify方法,喚醒等待的線程,被喚醒的線程進入阻塞隊列,一塊競爭鎖。

上面描述了Synchronized的加鎖流程,Synchronized的對象鎖存儲結(jié)構(gòu)是不是跟咱們想的一樣?實際就是的。

下面是對象鎖的存儲數(shù)據(jù)結(jié)構(gòu)(由C++實現(xiàn)):

ObjectMonitor() {
_header = NULL;
_count = 0;
_waiters = 0,
_recursions = 0;
_object = NULL;
_owner = NULL; // 持有鎖的線程
_WaitSet = NULL; // 等待隊列,存儲處于wait狀態(tài)的線程
_WaitSetLock = 0 ;
_Responsible = NULL ;
_succ = NULL ;
_cxq = NULL ;
FreeNext = NULL ;
_EntryList = NULL ; // 阻塞隊列,存儲處于等待鎖block狀態(tài)的線程
_SpinFreq = 0 ;
_SpinClock = 0 ;
OwnerIsThread = 0 ;
}

圖片

上圖展示了對象鎖的基本工作機制:

  • 當(dāng)多個線程同時訪問一段同步代碼時,首先會進入 _EntryList隊列中阻塞。
  • 當(dāng)某個線程獲取到對象的對象鎖后進入臨界區(qū)域,并把對象鎖中的 _owner變量設(shè)置為當(dāng)前線程,即獲得對象鎖。
  • 若持有對象鎖的線程調(diào)用 wait() 方法,將釋放當(dāng)前持有的對象鎖,_owner變量恢復(fù)為null,同時該線程進入 _WaitSet 集合中等待被喚醒。
  • 在_WaitSet集合中的線程被喚醒,會被再次放到_EntryList隊列中,重新競爭獲取鎖。
  • 若當(dāng)前線程執(zhí)行完畢也將釋放對象鎖并復(fù)位變量的值,以便其他線程進入獲取鎖。

Synchronized對象鎖存儲結(jié)構(gòu)和加鎖流程,竟然跟咱們想的一樣。

再看一下AQS的存儲結(jié)構(gòu)和加鎖流程,有沒有相似的地方。

2. AQS加鎖原理

先分析一下,我們使用AQS的加鎖需求:

  • 多個線程執(zhí)行到acquire方法的時候,只有一個線程獲取鎖,然后執(zhí)行同步代碼塊(需要記錄哪個線程獲取了對象鎖)。
  • 其他線程被阻塞(被阻塞的線程,是不是可以用鏈表設(shè)計個阻塞隊列?名叫”同步隊列“?)
  • 持有鎖的線程調(diào)用await方法,釋放鎖,等待被喚醒(等待的線程,是不是可以用鏈表設(shè)計個等待隊列?名叫”條件隊列“?)。
  • 被阻塞的線程開始競爭鎖
  • 調(diào)用signal方法,喚醒等待的線程,被喚醒的線程進入阻塞隊列,一塊競爭鎖。

AQS的需求跟Synchronized一模一樣。

我們再看一下AQS實際的加鎖機制是怎么設(shè)計的?是不是跟Synchronized相似?

圖片

AQS的加鎖流程并不復(fù)雜,只要理解了同步隊列和條件隊列,以及它們之間的數(shù)據(jù)流轉(zhuǎn),就算徹底理解了AQS。

  • 當(dāng)多個線程競爭AQS鎖時,如果有個線程獲取到鎖,就把ower線程設(shè)置為自己
  • 沒有競爭到鎖的線程,在同步隊列中阻塞(同步隊列采用雙向鏈表,尾插法)。
  • 持有鎖的線程調(diào)用await方法,釋放鎖,追加到條件隊列的末尾(條件隊列采用單鏈表,尾插法)。
  • 持有鎖的線程調(diào)用signal方法,喚醒條件隊列的頭節(jié)點,并轉(zhuǎn)移到同步隊列的末尾。
  • 同步隊列的頭節(jié)點優(yōu)先獲取到鎖

可以看到AQS和Synchronized的加鎖流程幾乎是一模一樣的,AQS中同步隊列就是Synchronized中EntryList,AQS中條件隊列就是Synchronized中的waitSet,兩個隊列之間的數(shù)據(jù)轉(zhuǎn)移流程也是一樣的。

3. 總結(jié)

AQS跟Synchronized的加鎖流程是一樣的,都是通過同步隊列和條件隊列實現(xiàn)的,阻塞狀態(tài)的線程被放到同步隊列中,等待狀態(tài)的線程被放到條件隊列中,從條件隊列喚醒的線程又被轉(zhuǎn)移到同步隊列末尾,一塊競爭鎖。

看完AQS加鎖流程,還沒有人不懂AQS的?

下篇文章再講一下AQS加鎖具體的源碼實現(xiàn)。里面有很多精巧的設(shè)計,值得我們學(xué)習(xí)。

比如:

為什么同步隊列要設(shè)計成雙向鏈表?而條件隊列要設(shè)計成單鏈表?

為什么AQS加鎖性能這么好(樂觀鎖CAS使用)?

同步隊列和條件隊列中節(jié)點怎么用一個對象實現(xiàn)?

釋放鎖后,怎么喚醒同步隊列中線程?

責(zé)任編輯:武曉燕 來源: 一燈架構(gòu)
相關(guān)推薦

2017-05-16 05:05:34

2019-05-09 19:00:40

量子加密加密技術(shù)安全

2021-12-08 08:30:55

Java AQS機制 Java 基礎(chǔ)

2019-12-16 10:27:10

機器學(xué)習(xí)人工智能AI

2024-06-05 19:11:23

2024-03-11 13:07:25

2021-08-24 10:25:19

thisclassJava

2021-08-02 07:57:03

SynchronizeJava語言

2023-11-06 14:55:33

2021-12-21 11:45:24

Log4Shell漏洞主機安全

2012-09-21 10:07:04

9月刊

2021-11-05 14:53:42

操作系統(tǒng)openEuler

2019-05-06 14:30:40

AI人工智能

2014-01-07 09:11:51

大數(shù)據(jù)云計算

2022-01-16 06:59:25

黑客網(wǎng)絡(luò)安全網(wǎng)絡(luò)攻擊

2017-11-02 15:44:11

內(nèi)存降價價格

2015-07-16 15:52:30

2023-03-09 17:43:13

2020-03-18 13:21:06

F5 應(yīng)用服務(wù)報告
點贊
收藏

51CTO技術(shù)棧公眾號

主站蜘蛛池模板: 国产精品成人在线 | 在线观看av网站永久 | 日韩精品一区在线观看 | japan21xxxxhd美女| 亚洲精品一二三 | 国产精品久久久久久妇女 | 亚洲精品68久久久一区 | 97国产精品视频人人做人人爱 | 国产电影一区二区 | 亚洲一区二区在线播放 | 鸳鸯谱在线观看高清 | 综合色久| 中文字幕一区二区三区在线乱码 | 欧美日韩高清一区 | 成人一级毛片 | 中文字幕在线一区二区三区 | 精品久久精品 | 三级视频久久 | 欧美在线免费 | 国产精品三级久久久久久电影 | 日本手机看片 | 国产精品区二区三区日本 | 午夜天堂精品久久久久 | 亚洲午夜精品久久久久久app | 成人高清网站 | 日韩在线中文字幕 | 久久er精品| 欧美日韩福利视频 | 亚洲精品自在在线观看 | 午夜一区二区三区在线观看 | 国产精品一卡二卡三卡 | 成人深夜福利 | 999国产精品视频 | 久久91av| 久久久久国产一区二区三区 | 成人免费网站www网站高清 | 日韩精品在线观看一区二区三区 | 久久久久久久av | 欧美日韩手机在线观看 | 岛国视频 | 爱爱无遮挡 |