日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > java >内容正文

java

Java并发编程:AbstractQueuedSynchronizer的内部结构

發布時間:2025/4/16 java 18 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Java并发编程:AbstractQueuedSynchronizer的内部结构 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

2019獨角獸企業重金招聘Python工程師標準>>>

一 前言  

  雖然已經有很多前輩已經分析過AbstractQueuedSynchronizer(簡稱AQS,也叫隊列同步器)類,但是感覺那些點始終是別人的,看一遍甚至幾遍終不會印象深刻。所以還是記錄下來印象更深刻,還能和大家一起探討(這就是重復造輪子的好處,另外也主要是這篇篇幅太長了,猶豫了好久才決定寫作)。既然有很多前輩都分析過這個類說明它是多么的重要,下面我們看下concurrent包的實現示意圖就清楚AQS的所占有的地位了。

?

二 什么是AQS

  AbstractQueuedSynchronizer,中文簡稱隊列同步器,英文簡稱AQS。它是用來構建鎖或者其他同步組件的基礎框架,它使用了一個int成員變量表示同步狀態,通過內置的FIFO隊列來完成資源獲取線程的排隊工作。從上面圖可以看出AQS是實現鎖或任意同步組件的關鍵,通過繼承同步器并實現它的抽象方法來管理同步狀態等。

在此我向大家推薦一個架構學習交流群。交流學習群號:478030634 ?里面會分享一些資深架構師錄制的視頻錄像:有Spring,MyBatis,Netty源碼分析,高并發、高性能、分布式、微服務架構的原理,JVM性能優化、分布式架構等這些成為架構師必備的知識體系。還能領取免費的學習資源,目前受益良多

三 AQS的內部結構

  個人習慣喜歡先看其內部結構,因為內部結果是一個類實現的核心。經過分析得知:AQS類底層的數據結構是使用雙向鏈表,包括head結點和tail結點,head結點主要用作后續的調度。另外還包含一個單向鏈表,只有當使用Condition時,才會存在此單向鏈表。并且可能會有多個Condition 鏈表(其中鏈表是隊列的一種具體表現,所以也可稱作隊列)。如下圖:

?

四 內部結構源碼解析

3.1 類的繼承關系

  

  1、說明它是一個抽象類,就說明它可能存在抽象方法需要子類去重寫實現(具體有哪些方法需要重寫后續會說明)。

  2、它還繼承了AbstractOwnableSynchronizer(簡稱AOS)類可以設置獨占資源線程和獲取獨占資源線程(獨占鎖會涉及到,AOS的源碼自己可以進去看看)。

  另外建議各位多看看類上的注釋,其實還蠻有作用的。

3.2 類的內部類

?  先分析內部類中的結構再看AQS是怎么引用它的。下面先看Node.class,主要分析都在注釋上了。

?

/*** Wait queue node class.* 注意看類上的注釋,上面是原注釋的第一行,表示等待隊列節點類(雖然實際上是一個雙向鏈表)。*/ static final class Node {/*** 總共分為兩者模式:共享和獨占*//** 在共享模式中等待的節點 */static final Node SHARED = new Node();/** 在獨占模式中等待的節點 */static final Node EXCLUSIVE = null;/*** 下面幾個表示節點狀態,也就是waitStatus所具有可能的值。*//*** 標記線程處于取消狀態* 節點進入該狀態就不會變化。* /static final int CANCELLED = 1;/*** 標記后繼節點的線程處于等待狀態,需要被取消停放(即被喚醒unpark)。* 變化情況:當當前節點的線程如果釋放了同步狀態或者被取消,將會通知后繼節點,使后繼節點的線程得以運行。*/static final int SIGNAL = -1;/*** 標記線程正在等待條件(Condition),也就是該節點處于等待隊列中。* 變化情況:當其他線程對Condition調用了signal()方法后,該節點將會從等待隊列中轉移到同步隊列中,加入到同步狀態的獲取中。*/static final int CONDITION = -2;/*** 表示下一次共享式同步狀態獲取將會無條件的被傳播下去。*/static final int PROPAGATE = -3;/*** 節點狀態,包含上面四種狀態(另外還有一種初始化狀態0)* 特別注意:它是volatile關鍵字修飾的,保證對其線程可見性,但是不保證原子性。* 所以更新狀態時,采用CAS方式去更新, 如:compareAndSetWaitStatus*/volatile int waitStatus;/*** 前驅節點,比如當前節點被取消,那就需要前驅節點和后繼節點來完成連接。*/volatile Node prev;/*** 后繼節點。*/volatile Node next;/*** 入隊列時的當前線程。*/volatile Thread thread;/*** 存儲condition隊列中的后繼節點。*/Node nextWaiter;/*** 判斷是否共享模式*/final boolean isShared() {return nextWaiter == SHARED;}/*** 獲取前置節點,如果前置節點為空就拋出異常*/final Node predecessor() throws NullPointerException {Node p = prev;if (p == null)throw new NullPointerException();elsereturn p;}// 省略三個構造函數 }

?

  總結下:當每個線程被阻塞時都會封裝成一個Node節點,放入隊列中。每個節點都包含了當前節點對應的線程、狀態、前置節點引用、后繼節點引用以及下一個等待者。

  其中還需要注意的是waitStatus對應的各個狀態代表著什么意思,另外不清楚volatile關鍵字作用的請前去閱讀下。

屬性名稱描述
int waitStatus表示節點的狀態。其中包含的狀態有:
  • CANCELLED,值為1,表示當前的線程被取消;節點進入該狀態就不會變化。
  • SIGNAL,值為-1,表示當前節點的后繼節點包含的線程需要運行,也就是unpark;變化情況:當當前節點的線程如果釋放了同步狀態或者被取消,將會通知后繼節點,使后繼節點的線程得以運行。
  • CONDITION,值為-2,表示當前節點在等待condition,也就是在condition隊列中;變化情況:當其他線程對Condition調用了signal()方法后,該節點將會從等待隊列中轉移到同步隊列中,加入到同步狀態的獲取中。
  • PROPAGATE,值為-3,表示當前場景下后續的acquireShared能夠得以執行;
  • 值為0,表示當前節點在sync隊列中,等待著獲取鎖。
  • Node prev 前驅節點,比如當前節點被取消,那就需要前驅節點和后繼節點來完成連接。
    Node next 后繼節點。
    Thread thread 入隊列時的當前線程。
    Node nextWaiter 存儲condition隊列中的后繼節點。

      接下來簡單看看ConditionObject的源碼,后續我們會單獨分析下這個類的作用。

    ?

    /*** 實現Condition接口*/ public class ConditionObject implements Condition, java.io.Serializable {private static final long serialVersionUID = 1173984872572414699L;/*** 條件隊列的第一個節點。*/private transient AbstractQueuedSynchronizer.Node firstWaiter;/*** 條件隊列的最后一個節點。*/private transient AbstractQueuedSynchronizer.Node lastWaiter; }

    ?

      從中可以看它還是實現了Condition接口,而Condition接口又定義了什么規范呢?自己去看:),你會不會發現有點跟Object中的幾個方法類似呢。

    3.3 主要內部成員

    ?

    // 頭結點private transient volatile Node head;// 尾結點private transient volatile Node tail;// 同步狀態private volatile int state;

    ?

    ?

    五 總結

      通過上述分析就很清楚其內部結構是什么了吧??偨Y下:

      節點(Node)是成為sync隊列和condition隊列構建的基礎,在同步器中就包含了sync隊列(Node雙向鏈表)。同步器擁有三個成員變量:sync隊列的頭結點head、sync隊列的尾節點tail和狀態state。對于鎖的獲取,請求形成節點,將其掛載在尾部,而鎖資源的轉移(釋放再獲取)是從頭部開始向后進行。對于同步器維護的狀態state,多個線程對其的獲取將會產生一個鏈式的結構。

    ?

    大家覺得文章對你還是有一點點幫助的,大家可以點擊下方二維碼進行關注。 《Java爛豬皮》 公眾號聊的不僅僅是Java技術知識,還有面試等干貨,后期還有大量架構干貨。大家一起關注吧!關注爛豬皮,你會了解的更多..............

    ?

    原文:https://www.cnblogs.com/yuanfy008/p/9608666.html

    轉載于:https://my.oschina.net/lanzhupi/blog/2046432

    總結

    以上是生活随笔為你收集整理的Java并发编程:AbstractQueuedSynchronizer的内部结构的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

    主站蜘蛛池模板: 久久精品国产亚洲7777 | 日韩亚洲精品中文字幕 | 国产精品精品软件视频 | 91色精品 | 99热99| 中文字幕一区二区三区乱码 | 韩国三级在线视频 | 国产免费叼嘿网站免费 | 狠狠伊人 | 欧美精品一区二区三区四区五区 | 国产一区二区三区影视 | 丰满少妇久久久久久久 | 日韩免费在线 | 欧美黄色一级生活片 | 精品无码人妻一区 | 一起草视频在线播放 | 网站色 | 四季av国产一区二区三区 | 麻豆视频软件 | 成人综合在线观看 | 蜜桃臀av| 欧美精品91| 中文字幕在线观看第一页 | 男同av在线观看一区二区三区 | а√天堂中文在线资源8 | 久久精品欧美一区二区 | 久久久久婷婷 | 一级片aaaa | 91重口味| 97在线视频免费 | 国产精品1区2区3区 在线看黄的网站 | 国产五区 | 日本无翼乌邪恶大全彩h | 不卡一区二区在线视频 | 欧美性生活一区二区三区 | 国产另类精品 | 男女涩涩| 韩国精品av | 欧美乱妇日本无乱码特黄大片 | 婷婷激情小说 | 天天干天天色 | a视频在线观看 | 久久99久久99精品中文字幕 | 超碰免费成人 | 黄色三级视频 | 五月婷婷激情在线 | 国产一区精品在线观看 | 99re超碰 | 中文字字幕在线中文 | 自由 日本语 热 亚洲人 | 九色视频丨porny丨丝袜 | 女生隐私免费看 | 久青草视频在线 | 高潮毛片7777777毛片 | 钻石午夜影院 | 国产精品久久国产精品99 | 午夜网站在线 | 色视频导航| 欧美激情免费视频 | 日本一区二区在线免费观看 | 一级二级av| 欧美少妇一区二区三区 | 欧美激情片在线观看 | 熟妇高潮一区二区三区在线播放 | 侵犯亲女在线播放视频 | 日韩欧美网站 | 成人黄色三级 | 久久综合亚洲色hezyo国产 | 日韩精品视频播放 | 中文精品视频 | youjizzcom日本 | 法国空姐电影在线观看 | 性av网站| 亚洲av鲁丝一区二区三区 | 国产91丝袜在线播放 | 99在线精品视频 | 无码人中文字幕 | 成熟人妻av无码专区 | 毛片一级在线观看 | 奇米影视狠狠干 | 性欧美1819性猛交 | 亚洲AV无码成人精品区明星换面 | 国内精品偷拍 | 初高中福利视频网站 | 久久老女人 | 开心综合网 | 日本做爰三级床戏 | 日本污视频在线观看 | 国产精品亚洲lv粉色 | 亚洲精品久久久久久久久久久 | 午夜剧场成人 | 久久久久久久久久久网 | 99热这里只有精品7 青青草社区 | 奇米中文字幕 | 毛片av网站 | 日韩视频播放 | 午夜777| 成人黄色电影在线 | 男人天堂欧美 |