<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    posts - 28,  comments - 15,  trackbacks - 0
    前面一節(jié)中,我們分析了ReentrantLock.lock()方法,接下來我們接著分析ReentrantLock.unlock()方法。

    1.ReentrantLock.unlock()分析

    (1)首先嘗試釋放鎖,如果要求釋放數(shù)等于鎖狀態(tài)數(shù),那么將鎖狀態(tài)位清0,清除鎖所有者,返回true;否則返回false;
    (2)如果(1)返回的是true,說明鎖完全釋放。接下來將檢查等待隊列,并選擇一個waitStatus處于等待狀態(tài)的節(jié)點下的線程unpark(恢復),選擇的依據(jù)是從尾節(jié)點開始,選取最靠近頭節(jié)點的等待節(jié)點,同時清理隊列中線程被取消的節(jié)點;
    (3)如果(1)返回false,說明鎖只是部分釋放,當前線程仍舊持有該鎖;

     1java.util.concurrent.locks.ReentrantLock
     2 public void unlock() {
     3        sync.release(1);
     4 }

     5
     6java.util.concurrent.locks.AbstractQueuedSynchronizer
     7public final boolean release(int arg) {
     8        if (tryRelease(arg)) {   
     9            Node h = head;
    10            if (h != null && h.waitStatus != 0)
    11                unparkSuccessor(h);
    12            return true;
    13        }

    14        return false;
    15    }

    16
    17
    18 protected final boolean tryRelease(int releases) {
    19            int c = getState() - releases;   //重入鎖加鎖的次數(shù)-釋放數(shù)量
    20            if (Thread.currentThread() != getExclusiveOwnerThread())   //判斷獨占鎖是否為當前線程所有
    21                throw new IllegalMonitorStateException();
    22            boolean free = false;
    23            if (c == 0{       //加鎖次數(shù)=釋放數(shù)量
    24                free = true;
    25                setExclusiveOwnerThread(null);     //清除鎖擁有者標識
    26            }

    27            setState(c);        //設置加鎖狀態(tài)
    28            return free;
    29        }

    30
    31
    32 /**
    33     * Wakes up node's successor, if one exists.
    34     *
    35     * @param node the node
    36     */

    37    private void unparkSuccessor(Node node) {
    38        /*
    39         * Try to clear status in anticipation of signalling.  It is
    40         * OK if this fails or if status is changed by waiting thread.
    41         */

    42        compareAndSetWaitStatus(node, Node.SIGNAL, 0);    //清除頭節(jié)點signal狀態(tài)
    43
    44        /*
    45         * Thread to unpark is held in successor, which is normally
    46         * just the next node.  But if cancelled or apparently null,
    47         * traverse backwards from tail to find the actual
    48         * non-cancelled successor.
    49         */

    50        Node s = node.next;
    51        if (s == null || s.waitStatus > 0{    //等待隊列喚醒的競爭滿足FIFO,本段代碼主要是尋找最靠近頭節(jié)點的,且waitStatus為signal、condition的鏈表節(jié)點
    52            s = null;
    53            for (Node t = tail; t != null && t != node; t = t.prev)
    54                if (t.waitStatus <= 0)
    55                    s = t;
    56        }

    57        if (s != null)
    58            LockSupport.unpark(s.thread);
    59    }


    posted on 2011-08-19 15:24 zhangxl 閱讀(1861) 評論(0)  編輯  收藏 所屬分類: java 并發(fā)
    <2025年7月>
    293012345
    6789101112
    13141516171819
    20212223242526
    272829303112
    3456789

    常用鏈接

    留言簿(1)

    隨筆分類(17)

    隨筆檔案(28)

    文章分類(30)

    文章檔案(30)

    相冊

    收藏夾(2)

    hibernate

    java基礎

    mysql

    xml

    關注

    壓力測試

    算法

    最新隨筆

    搜索

    •  

    積分與排名

    • 積分 - 96787
    • 排名 - 600

    最新評論

    閱讀排行榜

    評論排行榜

    主站蜘蛛池模板: 狠狠色香婷婷久久亚洲精品| 精品亚洲综合在线第一区| 亚洲w码欧洲s码免费| 无码国产精品一区二区免费模式| 亚洲乱码日产一区三区| 国产在线精品一区免费香蕉| 亚洲色自偷自拍另类小说| 日本三级在线观看免费| 亚洲高清专区日韩精品| 91av视频免费在线观看| 亚洲人成黄网在线观看| 免费精品人在线二线三线区别| 亚洲色少妇熟女11p| 国产三级免费电影| 72pao国产成视频永久免费| 久久久久久亚洲精品成人| 97久久精品亚洲中文字幕无码| 99久久人妻精品免费一区| 亚洲网红精品大秀在线观看| 亚洲国产精品专区| 成人超污免费网站在线看| 亚洲AV无码男人的天堂| 亚洲精品国自产拍在线观看| a级在线免费观看| 亚洲欧洲日产韩国在线| 真实乱视频国产免费观看| 久久国产精品亚洲一区二区| 久草视频免费在线| 蜜芽亚洲av无码一区二区三区| 美腿丝袜亚洲综合| 精品国产亚洲一区二区三区在线观看 | 国产精品免费久久久久久久久| 亚洲成色在线综合网站 | 成人免费无遮挡无码黄漫视频| 免费大片黄在线观看| 成人毛片18女人毛片免费| 日本一区二区在线免费观看 | 亚洲一区二区影院| 免费无码不卡视频在线观看| A级毛片成人网站免费看| 亚洲国产午夜中文字幕精品黄网站 |