最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

AbstractQueuedSynchronizer內(nèi)部類Node使用講解

 更新時(shí)間:2023年07月23日 12:41:31   作者:今夜有點(diǎn)兒涼  
這篇文章主要為大家介紹了AbstractQueuedSynchronizer內(nèi)部類Node使用講解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪

Node類源碼

以下是Node類源碼,同時(shí)附上了代碼解釋:

static final class Node {
    /** 用于表示節(jié)點(diǎn)正在以共享模式等待的標(biāo)記 */
    static final Node SHARED = new Node();
    /** 用于表示節(jié)點(diǎn)正在以獨(dú)占模式等待的標(biāo)記 */
    static final Node EXCLUSIVE = null;
    /** waitStatus的值,表示線程已被取消 */
    static final int CANCELLED = 1;
    /** waitStatus的值,表示后繼節(jié)點(diǎn)的線程需要被喚醒 */
    static final int SIGNAL = -1;
    /** waitStatus的值,表示線程正在等待條件 */
    static final int CONDITION = -2;
    /**
     * waitStatus的值,表示下一個(gè)acquireShared操作應(yīng)該無(wú)條件地傳播
     */
    static final int PROPAGATE = -3;
    /**
     * 狀態(tài)字段,只有以下幾個(gè)取值:
     *   SIGNAL: 后繼節(jié)點(diǎn)的線程被阻塞(通過(guò)park方法),因此當(dāng)前節(jié)點(diǎn)在釋放或取消時(shí)必須喚醒其后繼節(jié)點(diǎn)。
     *           為了避免競(jìng)爭(zhēng)條件,acquire方法必須首先表明它們需要一個(gè)信號(hào),然后重試原子性的acquire操作,
     *           失敗后再阻塞。
     *   CANCELLED: 由于超時(shí)或中斷,該節(jié)點(diǎn)被取消。節(jié)點(diǎn)一旦進(jìn)入這個(gè)狀態(tài)就不會(huì)再離開(kāi)。
     *              特別地,被取消的線程不會(huì)再次阻塞。
     *   CONDITION: 該節(jié)點(diǎn)當(dāng)前在條件隊(duì)列中。在轉(zhuǎn)移時(shí),它將不再用作同步隊(duì)列節(jié)點(diǎn),
     *              此時(shí)狀態(tài)將被設(shè)置為0。(在這里使用該值與字段的其他用途無(wú)關(guān),但簡(jiǎn)化了機(jī)制。)
     *   PROPAGATE: 需要將releaseShared操作傳播到其他節(jié)點(diǎn)。這個(gè)值(僅用于頭節(jié)點(diǎn))在doReleaseShared中設(shè)置,
     *              以確保傳播繼續(xù),即使在此期間有其他操作進(jìn)行。
     *   0: 無(wú)上述狀態(tài)
     * 
     * 這些值按照數(shù)值順序排列,以簡(jiǎn)化使用。非負(fù)值表示節(jié)點(diǎn)不需要發(fā)出信號(hào)。
     * 因此,大多數(shù)代碼不需要檢查特定的值,只需要檢查符號(hào)即可。
     * 
     * 對(duì)于普通的同步節(jié)點(diǎn),該字段初始化為0;對(duì)于條件節(jié)點(diǎn),初始化為CONDITION。
     * 該字段使用CAS(或在可能的情況下,無(wú)條件的volatile寫(xiě)操作)進(jìn)行修改。
     */
    volatile int waitStatus;
    /**
     * 前驅(qū)節(jié)點(diǎn)的鏈接,當(dāng)前節(jié)點(diǎn)/線程依賴于它來(lái)檢查waitStatus。
     * 在入隊(duì)時(shí)分配,并在出隊(duì)時(shí)置空(為了進(jìn)行垃圾回收)。
     * 當(dāng)前驅(qū)節(jié)點(diǎn)被取消時(shí),我們會(huì)快速找到一個(gè)非取消的前驅(qū)節(jié)點(diǎn),
     * 因?yàn)轭^節(jié)點(diǎn)永遠(yuǎn)不會(huì)被取消:只有成功獲取鎖的結(jié)果才會(huì)成為頭節(jié)點(diǎn)。
     * 取消的線程永遠(yuǎn)不會(huì)成功獲取鎖,而且只有線程自己可以取消,而不是其他節(jié)點(diǎn)。
     */
    volatile Node prev;
    /**
     * 后繼節(jié)點(diǎn)的鏈接,在釋放時(shí)當(dāng)前節(jié)點(diǎn)/線程將其喚醒。
     * 在入隊(duì)時(shí)進(jìn)行調(diào)整以跳過(guò)已取消的前驅(qū)節(jié)點(diǎn),并在出隊(duì)時(shí)置空(為了進(jìn)行垃圾回收)。
     * 在enq操作中,直到附加之后才給前驅(qū)節(jié)點(diǎn)的next字段賦值,
     * 因此看到一個(gè)空的next字段并不一定意味著節(jié)點(diǎn)在隊(duì)列末尾。
     * 但是,如果next字段看起來(lái)為空,我們可以從尾部向前掃描prev節(jié)點(diǎn)來(lái)進(jìn)行雙重檢查。
     * 取消的節(jié)點(diǎn)的next字段被設(shè)置為指向節(jié)點(diǎn)自身,而不是null,
     * 這樣可以簡(jiǎn)化isOnSyncQueue方法的實(shí)現(xiàn)。
     */
    volatile Node next;
    /**
     * 入隊(duì)該節(jié)點(diǎn)的線程。在構(gòu)造時(shí)初始化,并在使用后置空。
     */
    volatile Thread thread;
    /**
     * 鏈接到下一個(gè)在條件上等待的節(jié)點(diǎn),或者特殊值SHARED。
     * 因?yàn)闂l件隊(duì)列只有在持有獨(dú)占模式時(shí)才會(huì)訪問(wèn),
     * 所以我們只需要一個(gè)簡(jiǎn)單的鏈?zhǔn)疥?duì)列來(lái)保存節(jié)點(diǎn),
     * 而它們?cè)诘却龡l件時(shí)會(huì)被轉(zhuǎn)移到同步隊(duì)列中以重新獲取鎖。
     * 由于條件只能是獨(dú)占的,所以我們通過(guò)使用特殊值來(lái)表示共享模式來(lái)節(jié)省一個(gè)字段。
     */
    Node nextWaiter;
    /**
     * 如果節(jié)點(diǎn)在共享模式下等待,則返回true。
     */
    final boolean isShared() {
        return nextWaiter == SHARED;
    }
    /**
     * 返回前驅(qū)節(jié)點(diǎn),如果前驅(qū)節(jié)點(diǎn)為null,則拋出NullPointerException異常。
     * 當(dāng)無(wú)法為null時(shí)使用,可以省略空檢查,但為了幫助虛擬機(jī),這里進(jìn)行了空檢查。
     *
     * @return 當(dāng)前節(jié)點(diǎn)的前驅(qū)節(jié)點(diǎn)
     */
    final Node predecessor() throws NullPointerException {
        Node p = prev;
        if (p == null)
            throw new NullPointerException();
        else
            return p;
    }
    Node() {    // 用于建立初始頭節(jié)點(diǎn)或SHARED標(biāo)記
    }
    Node(Thread thread, Node mode) {     // 由addWaiter方法使用
        this.nextWaiter = mode;
        this.thread = thread;
    }
    Node(Thread thread, int waitStatus) { // 由Condition使用
        this.waitStatus = waitStatus;
        this.thread = thread;
    }
}

這段代碼定義了一個(gè)內(nèi)部類Node,用于構(gòu)建同步隊(duì)列或條件隊(duì)列等數(shù)據(jù)結(jié)構(gòu)。

代碼解釋

  • Node類有一些靜態(tài)常量,如SHAREDEXCLUSIVE,它們分別表示共享模式和獨(dú)占模式的節(jié)點(diǎn)。這些常量用于區(qū)分不同類型的節(jié)點(diǎn)。
  • Node類有一個(gè)waitStatus字段,用于表示節(jié)點(diǎn)的等待狀態(tài)。具體的狀態(tài)值有CANCELLED、SIGNAL、CONDITION、PROPAGATE和0,分別表示節(jié)點(diǎn)被取消、后繼節(jié)點(diǎn)需要喚醒、節(jié)點(diǎn)在條件隊(duì)列中等待、需要傳播信號(hào)以及無(wú)特殊狀態(tài)。這些狀態(tài)用于控制線程的等待和喚醒。
  • Node類有一個(gè)prev字段和一個(gè)next字段,分別表示前驅(qū)節(jié)點(diǎn)和后繼節(jié)點(diǎn)。這些字段用于構(gòu)建隊(duì)列結(jié)構(gòu),并且在節(jié)點(diǎn)入隊(duì)和出隊(duì)時(shí)進(jìn)行相應(yīng)的調(diào)整。
  • Node類有一個(gè)thread字段,表示當(dāng)前節(jié)點(diǎn)對(duì)應(yīng)的線程。
  • Node類有一個(gè)nextWaiter字段,用于在條件隊(duì)列中表示下一個(gè)等待的節(jié)點(diǎn),或者用SHARED特殊值表示共享模式。
  • isShared()方法返回一個(gè)布爾值,表示節(jié)點(diǎn)是否在共享模式下等待。
  • predecessor()方法返回前驅(qū)節(jié)點(diǎn),如果前驅(qū)節(jié)點(diǎn)為null,則拋出NullPointerException異常。
  • Node類有多個(gè)構(gòu)造函數(shù),用于創(chuàng)建不同類型的節(jié)點(diǎn)。其中,一個(gè)構(gòu)造函數(shù)用于addWaiter方法,另一個(gè)構(gòu)造函數(shù)用于Condition。

總結(jié)

這段代碼實(shí)現(xiàn)了一個(gè)用于同步隊(duì)列或條件隊(duì)列的節(jié)點(diǎn)數(shù)據(jù)結(jié)構(gòu),用于管理等待線程的狀態(tài)和關(guān)系。通過(guò)這些節(jié)點(diǎn),可以實(shí)現(xiàn)線程的等待和喚醒機(jī)制。

以上就是AbstractQueuedSynchronizer內(nèi)部類Node使用講解的詳細(xì)內(nèi)容,更多關(guān)于AbstractQueuedSynchronizer內(nèi)部類Node的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • java使用compareTo實(shí)現(xiàn)一個(gè)類的對(duì)象之間比較大小操作

    java使用compareTo實(shí)現(xiàn)一個(gè)類的對(duì)象之間比較大小操作

    這篇文章主要介紹了java使用compareTo實(shí)現(xiàn)一個(gè)類的對(duì)象之間比較大小操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2020-09-09
  • springboot logback如何從apollo配置中心讀取變量

    springboot logback如何從apollo配置中心讀取變量

    這篇文章主要介紹了springboot logback如何從apollo配置中心讀取變量的操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-08-08
  • Java算法練習(xí)題,每天進(jìn)步一點(diǎn)點(diǎn)(2)

    Java算法練習(xí)題,每天進(jìn)步一點(diǎn)點(diǎn)(2)

    方法下面小編就為大家?guī)?lái)一篇Java算法的一道練習(xí)題(分享)。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧,希望可以幫到你
    2021-07-07
  • Spring?c3p0配置的實(shí)現(xiàn)示例

    Spring?c3p0配置的實(shí)現(xiàn)示例

    在Spring框架中配置c3p0連接池可以提升數(shù)據(jù)庫(kù)操作性能,本文主要介紹了Spring?c3p0配置的實(shí)現(xiàn)示例,具有一定的參考價(jià)值,感興趣的可以了解一下
    2024-09-09
  • SpringBoot升級(jí)Tomcat引發(fā)的問(wèn)題及解決方案

    SpringBoot升級(jí)Tomcat引發(fā)的問(wèn)題及解決方案

    在SpringBoot項(xiàng)目維護(hù)過(guò)程中,版本升級(jí)是常見(jiàn)操作,但往往會(huì)引發(fā)一些兼容性問(wèn)題,本文記錄了將SpringBoot內(nèi)置Tomcat從8.5.51升級(jí)到9.0.75后遇到的兩個(gè)典型問(wèn)題,并給出對(duì)應(yīng)的解決方案和原理分析,需要的朋友可以參考下
    2026-03-03
  • java技巧:反射判斷field類型的操作

    java技巧:反射判斷field類型的操作

    這篇文章主要介紹了java技巧:反射判斷field類型的操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-05-05
  • Java語(yǔ)言實(shí)現(xiàn)基數(shù)排序代碼分享

    Java語(yǔ)言實(shí)現(xiàn)基數(shù)排序代碼分享

    這篇文章主要介紹了Java語(yǔ)言實(shí)現(xiàn)基數(shù)排序代碼分享,具有一定借鑒價(jià)值,需要的朋友可以參考下。
    2017-12-12
  • 基于springboot2集成jpa,創(chuàng)建dao的案例

    基于springboot2集成jpa,創(chuàng)建dao的案例

    這篇文章主要介紹了基于springboot2集成jpa,創(chuàng)建dao的案例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2021-01-01
  • Java8新特性之默認(rèn)方法和靜態(tài)方法

    Java8新特性之默認(rèn)方法和靜態(tài)方法

    這篇文章主要給大家介紹了關(guān)于Java8新特性之默認(rèn)方法和靜態(tài)方法的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2021-03-03
  • Spring boot中PropertySource注解的使用方法詳解

    Spring boot中PropertySource注解的使用方法詳解

    這篇文章主要給大家介紹了關(guān)于Spring boot中PropertySource注解的使用方法,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家學(xué)習(xí)或者使用Spring boot具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來(lái)一起學(xué)習(xí)學(xué)習(xí)吧。
    2017-12-12

最新評(píng)論

桂林市| 太仆寺旗| 宁南县| 哈巴河县| 八宿县| 出国| 石泉县| 宜章县| 林口县| 唐山市| 黄平县| 汝城县| 武定县| 镇平县| 蓬溪县| 涪陵区| 喜德县| 巨鹿县| 陵川县| 阿拉善盟| 沽源县| 措美县| 巧家县| 抚宁县| 水富县| 湖州市| 南陵县| 汝南县| 泸水县| 朔州市| 杭锦后旗| 会泽县| 夹江县| 廊坊市| 枣强县| 丘北县| 临湘市| 全州县| 通化县| 广元市| 南部县|