亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

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

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

Node類源碼

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

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

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

代碼解釋

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

總結(jié)

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

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

相關(guān)文章

  • java開發(fā)validate方法中校驗工具類詳解

    java開發(fā)validate方法中校驗工具類詳解

    這篇文章主要為大家介紹了java開發(fā)validate方法中校驗工具類詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-09-09
  • Java多線程的用法詳細(xì)介紹

    Java多線程的用法詳細(xì)介紹

    這篇文章主要介紹了Java多線程的用法詳細(xì)介紹的相關(guān)資料,希望通過本文能幫助到大家,需要的朋友可以參考下
    2017-09-09
  • Java如何將處理完異常之后的程序能夠從拋出異常的地點向下執(zhí)行?

    Java如何將處理完異常之后的程序能夠從拋出異常的地點向下執(zhí)行?

    今天小編就為大家分享一篇關(guān)于Java如何將處理完異常之后的程序能夠從拋出異常的地點向下執(zhí)行?,小編覺得內(nèi)容挺不錯的,現(xiàn)在分享給大家,具有很好的參考價值,需要的朋友一起跟隨小編來看看吧
    2019-04-04
  • Java集合排序規(guī)則接口Comparator用法解析

    Java集合排序規(guī)則接口Comparator用法解析

    這篇文章主要介紹了Java集合排序規(guī)則接口Comparator用法解析,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2020-09-09
  • 基于maven install 沒反應(yīng)的解決方法

    基于maven install 沒反應(yīng)的解決方法

    下面小編就為大家?guī)硪黄趍aven install 沒反應(yīng)的解決方法。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-06-06
  • mybatis if test條件判斷語句中的判斷問題分析

    mybatis if test條件判斷語句中的判斷問題分析

    這篇文章主要介紹了mybatis if test條件判斷語句中的判斷問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-03-03
  • 深入分析Java并發(fā)編程之CAS

    深入分析Java并發(fā)編程之CAS

    這篇文章主要介紹了Java并發(fā)編程之CAS的相關(guān)資料,幫助大家更好的理解和學(xué)習(xí)Java并發(fā)編程,感興趣的朋友可以了解下
    2020-08-08
  • Java?注解@PostConstruct的原理及最佳使用場景分析

    Java?注解@PostConstruct的原理及最佳使用場景分析

    @PostConstruct?是?Java?中非常實用的注解,尤其是在?Spring?等框架中,它使得開發(fā)者可以方便地在?Bean?初始化后執(zhí)行額外的操作,本文給大家介紹@PostConstruct?的原理、使用場景及最佳實踐,感興趣的朋友一起看看吧
    2025-04-04
  • IntelliJ IDEA下自動生成Hibernate映射文件以及實體類

    IntelliJ IDEA下自動生成Hibernate映射文件以及實體類

    這篇文章主要介紹了IntelliJ IDEA下自動生成Hibernate映射文件以及實體類,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-11-11
  • Java使用POI從Excel讀取數(shù)據(jù)并存入數(shù)據(jù)庫(解決讀取到空行問題)

    Java使用POI從Excel讀取數(shù)據(jù)并存入數(shù)據(jù)庫(解決讀取到空行問題)

    有時候需要在java中讀取excel文件的內(nèi)容,專業(yè)的方式是使用java POI對excel進(jìn)行讀取,這篇文章主要給大家介紹了關(guān)于Java使用POI從Excel讀取數(shù)據(jù)并存入數(shù)據(jù)庫,文中介紹的辦法可以解決讀取到空行問題,需要的朋友可以參考下
    2023-12-12

最新評論