麻豆小视频在线观看_中文黄色一级片_久久久成人精品_成片免费观看视频大全_午夜精品久久久久久久99热浪潮_成人一区二区三区四区

首頁 > 學院 > 開發設計 > 正文

【Java并發編程實戰】-----“J.U.C”:ReentrantLock之三unlock方法分析

2019-11-15 01:15:37
字體:
來源:轉載
供稿:網友
java并發編程實戰】-----“J.U.C”:ReentrantLock之三unlock方法分析

前篇博客LZ已經分析了ReentrantLock的lock()實現過程,我們了解到lock實現機制有公平鎖和非公平鎖,兩者的主要區別在于公平鎖要按照CLH隊列等待獲取鎖,而非公平鎖無視CLH隊列直接獲取鎖。但是對于unlock()而已,它是不分為公平鎖和非公平鎖的。

public void unlock() {        sync.release(1);    }    public final boolean release(int arg) {        if (tryRelease(arg)) {            Node h = head;            if (h != null && h.waitStatus != 0)                unparkSuccessor(h);            return true;        }        return false;    }

release(1),嘗試在當前鎖的鎖定計數(state)值上減1。成功返回true,否則返回false。當然在release()方法中不僅僅只是將state - 1這么簡單,- 1之后還需要進行一番處理,如果-1之后的新state = 0 ,則表示當前鎖已經被線程釋放了,同時會喚醒線程等待隊列中的下一個線程,當然該鎖不一定就一定會把所有權交給下一個線程,能不能成功就看它是不是親爹生的了(看運氣)。

PRotected final boolean tryRelease(int releases) {        int c = getState() - releases;   //state - 1        //判斷是否為當前線程在調用,不是拋出IllegalMonitorStateException異常        if (Thread.currentThread() != getExclusiveOwnerThread())               throw new IllegalMonitorStateException();        boolean free = false;        //c == 0,釋放該鎖,同時將當前所持有線程設置為null        if (c == 0) {            free = true;            setExclusiveOwnerThread(null);        }        //設置state        setState(c);        return free;    }

在release代碼中有一段代碼很重要:

Node h = head;            if (h != null && h.waitStatus != 0)                unparkSuccessor(h);            return true;

對于這個LZ在前篇博客已經較為詳細的闡述了。不懂或者忘記請再次翻閱:【Java并發編程實戰】-----“J.U.C”:ReentrantLock之二lock方法分析

waitStatus!=0表明或者處于CANCEL狀態,或者是置SIGNAL表示下一個線程在等待其喚醒。也就是說waitStatus不為零表示它的后繼在等待喚醒。

unparkSuccessor()方法:

private void unparkSuccessor(Node node) {        int ws = node.waitStatus;        //如果waitStatus < 0 則將當前節點清零        if (ws < 0)            compareAndSetWaitStatus(node, ws, 0);        //若后續節點為空或已被cancel,則從尾部開始找到隊列中第一個waitStatus<=0,即未被cancel的節點        Node s = node.next;        if (s == null || s.waitStatus > 0) {            s = null;            for (Node t = tail; t != null && t != node; t = t.prev)                if (t.waitStatus <= 0)                    s = t;        }        if (s != null)            LockSupport.unpark(s.thread);    }

注:unlock最好放在finally中!!!!!!unlock最好放在finally中!!!!!! unlock最好放在finally中!!!!!! (重要的事說三遍)

 

參考文獻:

1、Java多線程系列--“JUC鎖”04之 公平鎖(二)


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 国产色91 | 国产日本欧美在线观看 | 久久精品视频在线免费观看 | 欧美成人一区免费视频 | 日韩精品dvd | 国产大片全部免费看 | 午夜视频在线看 | 中文字幕免费看 | 毛片在线免费观看完整版 | 成人wxx视频免费 | 国产一区二区三区在线观看视频 | 欧美性猛交xxxxx按摩国内 | 久久久久久久一区 | 做爰xxxⅹ性护士hd在线 | 国产成人高潮免费观看精品 | 日韩在线激情 | 日本黄色免费观看视频 | 一级黄色在线免费观看 | 日韩字幕 | 成人免费福利视频 | 成人在线国产 | 成人毛片网站 | 毛片免费试看 | 伦一区二区三区中文字幕v亚洲 | 一本色道精品久久一区二区三区 | 亚洲国产精品久久久久制服红楼梦 | 亚洲精品午夜国产va久久成人 | 日韩一级毛毛片 | 国产精品99久久久久久大便 | a黄色片 | 亚洲性生活免费视频 | 免费久久久久 | 中文字幕欧美专区 | 国产精品免费大片 | 中文字幕激情视频 | 一级黄色免费电影 | 激情久久一区二区 | 国产乱xxxx | 日日操日日操 | 蜜桃av鲁一鲁一鲁一鲁 | 牛牛视频在线 |