真实的国产乱ⅩXXX66竹夫人,五月香六月婷婷激情综合,亚洲日本VA一区二区三区,亚洲精品一区二区三区麻豆

成都創(chuàng)新互聯(lián)網(wǎng)站制作重慶分公司

如何理解非公平鎖與公平鎖

這篇文章主要講解了“如何理解非公平鎖與公平鎖”,文中的講解內(nèi)容簡單清晰,易于學(xué)習(xí)與理解,下面請大家跟著小編的思路慢慢深入,一起來研究和學(xué)習(xí)“如何理解非公平鎖與公平鎖”吧!

10余年的高唐網(wǎng)站建設(shè)經(jīng)驗(yàn),針對設(shè)計(jì)、前端、開發(fā)、售后、文案、推廣等六對一服務(wù),響應(yīng)快,48小時(shí)及時(shí)工作處理。網(wǎng)絡(luò)營銷推廣的優(yōu)勢是能夠根據(jù)用戶設(shè)備顯示端的尺寸不同,自動調(diào)整高唐建站的顯示方式,使網(wǎng)站能夠適用不同顯示終端,在瀏覽器中調(diào)整網(wǎng)站的寬度,無論在任何一種瀏覽器上瀏覽網(wǎng)站,都能展現(xiàn)優(yōu)雅布局與設(shè)計(jì),從而大程度地提升瀏覽體驗(yàn)。成都創(chuàng)新互聯(lián)公司從事“高唐網(wǎng)站設(shè)計(jì)”,“高唐網(wǎng)站推廣”以來,每個客戶項(xiàng)目都認(rèn)真落實(shí)執(zhí)行。

公平鎖與非公平鎖的一個重要區(qū)別就在于上圖中的2、6、10那個步驟,對應(yīng)源碼如下:

//非公平鎖
 final boolean nonfairTryAcquire(int acquires) {
            final Thread current = Thread.currentThread();
            int c = getState();
            if (c == 0) {
              //區(qū)別重點(diǎn)看這里
                if (compareAndSetState(0, acquires)) {
                    setExclusiveOwnerThread(current);
                    return true;
                }
            }
            else if (current == getExclusiveOwnerThread()) {
                int nextc = c + acquires;
                if (nextc < 0) // overflow
                    throw new Error("Maximum lock count exceeded");
                setState(nextc);
                return true;
            }
            return false;
        }

  //公平鎖
  protected final boolean tryAcquire(int acquires) {
            final Thread current = Thread.currentThread();
            int c = getState();
            if (c == 0) {
              //hasQueuedPredecessors這個方法就是最大區(qū)別所在
                if (!hasQueuedPredecessors() &&
                    compareAndSetState(0, acquires)) {
                    setExclusiveOwnerThread(current);
                    return true;
                }
            }
            else if (current == getExclusiveOwnerThread()) {
                int nextc = c + acquires;
                if (nextc < 0)
                    throw new Error("Maximum lock count exceeded");
                setState(nextc);
                return true;
            }
            return false;
        }

分析以上代碼,我們可以看到公平鎖就是在獲取鎖之前會先判斷等待隊(duì)列是否為空或者自己是否位于隊(duì)列頭部,該條件通過才能繼續(xù)獲取鎖。
在結(jié)合兔子喝水的圖分析,非公平鎖獲取所得順序基本決定在9、10、11這三個事件發(fā)生的先后順序,
1、若在釋放鎖的時(shí)候總是沒有新的兔子來打擾,則非公平鎖等于公平鎖;
2、若釋放鎖的時(shí)候,正好一個兔子來喝水,而此時(shí)位于隊(duì)列頭的兔子還沒有被喚醒(因?yàn)榫€程上下文切換是需要不少開銷的),此時(shí)后來的兔子則優(yōu)先獲得鎖,成功打破公平,成為非公平鎖;

其實(shí)對于非公平鎖,只要線程進(jìn)入了等待隊(duì)列,隊(duì)列里面依然是FIFO的原則,跟公平鎖的順序是一樣的。因?yàn)楣芥i與非公平鎖的release()部分代碼是共用AQS的代碼。

private void unparkSuccessor(Node node) {
        int ws = node.waitStatus;
        if (ws < 0)
            compareAndSetWaitStatus(node, ws, 0);

        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)
           //喚醒隊(duì)列頭的線程
            LockSupport.unpark(s.thread);
    }

感謝各位的閱讀,以上就是“如何理解非公平鎖與公平鎖”的內(nèi)容了,經(jīng)過本文的學(xué)習(xí)后,相信大家對如何理解非公平鎖與公平鎖這一問題有了更深刻的體會,具體使用情況還需要大家實(shí)踐驗(yàn)證。這里是創(chuàng)新互聯(lián),小編將為大家推送更多相關(guān)知識點(diǎn)的文章,歡迎關(guān)注!


當(dāng)前文章:如何理解非公平鎖與公平鎖
本文網(wǎng)址:http://weahome.cn/article/jpschg.html

其他資訊

在線咨詢

微信咨詢

電話咨詢

028-86922220(工作日)

18980820575(7×24)

提交需求

返回頂部