成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

java重入鎖、公平鎖和非公平鎖

netmou / 1333人閱讀

摘要:很吧判斷是否有前驅(qū)線程等待獲取鎖公平所和非公平鎖的各自優(yōu)勢是什么那公平鎖很好理解,可以防止出現(xiàn)線程饑餓現(xiàn)象,每一個線程都有機(jī)會獲取到鎖。非公平鎖可能會導(dǎo)致線程饑餓,但是我們一般使用非公平鎖,因為非公平鎖可以減少上下文的切換,提高效率。

鎖的重入是指同一個線程可以多次獲取同一個鎖,synchronize是隱式的可重入鎖,ReentrantLock通過代碼實(shí)現(xiàn)了鎖的重入:
    final boolean nofairTryAcquire(int acquires){
        final Thread current=Thread.currentThread();
        int c=getState();
        if(c==0){
              if(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;
    }

從上面的代碼中,可以一目了然的發(fā)現(xiàn),當(dāng)獲取鎖的線程與擁有鎖的線程是同一個線程時,僅會對狀態(tài)進(jìn)行累加。so easy ,并沒有什么難度。那接下來我們想一下,如何實(shí)現(xiàn)公平所和非公平鎖,上面的代碼是非公平鎖的實(shí)現(xiàn)方式。那如何實(shí)現(xiàn)公平鎖那?所謂的公平鎖就是所有獲取鎖的線程都要按照“先來后到”的順序獲取鎖。假設(shè)線程B在阻塞隊列中,等待獲取鎖,如果還有一個線程A在B的前面,那么B就要讓A先獲取鎖。因此在B嘗試獲取鎖之前,只要判斷一下它是否還有前驅(qū)的隊列即可。很easy吧:

final boolean fairTryAcquire(int acquires){
        final Thread current=Thread.currentThread();
        int c=getState();
        if(c==0){
              if(!hasQueuedPredecessors()&&compareAndSetState(0,acquires)){//判斷是否有前驅(qū)線程等待獲取鎖
                  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;
    }

公平所和非公平鎖的各自優(yōu)勢是什么那?公平鎖很好理解,可以防止出現(xiàn)線程饑餓現(xiàn)象,每一個線程都有機(jī)會獲取到鎖。非公平鎖可能會導(dǎo)致線程饑餓,但是我們一般使用非公平鎖,因為非公平鎖可以減少上下文的切換,提高效率。

文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/72822.html

相關(guān)文章

  • Java ReentrantLock 原理分析

    摘要:的主要功能和關(guān)鍵字一致,均是用于多線程的同步。而僅支持通過查詢當(dāng)前線程是否持有鎖。由于和使用的是同一把可重入鎖,所以線程可以進(jìn)入方法,并再次獲得鎖,而不會被阻塞住。公平與非公平公平與非公平指的是線程獲取鎖的方式。 1.簡介 可重入鎖ReentrantLock自 JDK 1.5 被引入,功能上與synchronized關(guān)鍵字類似。所謂的可重入是指,線程可對同一把鎖進(jìn)行重復(fù)加鎖,而不會被阻...

    lx1036 評論0 收藏0
  • J.U.C|可ReentrantLock

    摘要:二什么是重入鎖可重入鎖,顧名思義,支持重新進(jìn)入的鎖,其表示該鎖能支持一個線程對資源的重復(fù)加鎖。將由最近成功獲得鎖,并且還沒有釋放該鎖的線程所擁有??梢允褂煤头椒▉頇z查此情況是否發(fā)生。 一、寫在前面 前幾篇我們具體的聊了AQS原理以及底層源碼的實(shí)現(xiàn),具體參見 《J.U.C|一文搞懂AQS》《J.U.C|同步隊列(CLH)》《J.U.C|AQS獨(dú)占式源碼分析》《J.U.C|AQS共享式源...

    wangdai 評論0 收藏0
  • 不可不說的Java”事

    摘要:本文旨在對鎖相關(guān)源碼本文中的源碼來自使用場景進(jìn)行舉例,為讀者介紹主流鎖的知識點(diǎn),以及不同的鎖的適用場景。中,關(guān)鍵字和的實(shí)現(xiàn)類都是悲觀鎖。自適應(yīng)意味著自旋的時間次數(shù)不再固定,而是由前一次在同一個鎖上的自旋時間及鎖的擁有者的狀態(tài)來決定。 前言 Java提供了種類豐富的鎖,每種鎖因其特性的不同,在適當(dāng)?shù)膱鼍跋履軌蛘宫F(xiàn)出非常高的效率。本文旨在對鎖相關(guān)源碼(本文中的源碼來自JDK 8)、使用場景...

    galaxy_robot 評論0 收藏0
  • Java并發(fā)編程,深入理解ReentrantLock

    摘要:公平鎖為了保證時間上的絕對順序,需要頻繁的上下文切換,而非公平鎖會降低一定的上下文切換,降低性能開銷。因此,默認(rèn)選擇的是非公平鎖,則是為了減少一部分上下文切換,保證了系統(tǒng)更大的吞吐量。ReentrantLock簡介ReentrantLock重入鎖,是實(shí)現(xiàn)Lock接口的一個類,也是在實(shí)際編程中使用頻率很高的一個鎖, 支持重入性,表示能夠?qū)蚕碣Y源能夠重復(fù)加鎖,即當(dāng)前線程獲取該鎖再次獲取不會被阻...

    番茄西紅柿 評論0 收藏0
  • Java并發(fā)編程,深入理解ReentrantLock

    摘要:公平鎖為了保證時間上的絕對順序,需要頻繁的上下文切換,而非公平鎖會降低一定的上下文切換,降低性能開銷。因此,默認(rèn)選擇的是非公平鎖,則是為了減少一部分上下文切換,保證了系統(tǒng)更大的吞吐量。ReentrantLock簡介ReentrantLock重入鎖,是實(shí)現(xiàn)Lock接口的一個類,也是在實(shí)際編程中使用頻率很高的一個鎖, 支持重入性,表示能夠?qū)蚕碣Y源能夠重復(fù)加鎖,即當(dāng)前線程獲取該鎖再次獲取不會被阻...

    番茄西紅柿 評論0 收藏0

發(fā)表評論

0條評論

最新活動
閱讀需要支付1元查看
<