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

資訊專欄INFORMATION COLUMN

Java重入鎖死簡介

LeexMuller / 1942人閱讀

摘要:可重入的意思是線程可以重復(fù)獲得它已經(jīng)持有的鎖。如果一個線程持有某個管程對象上的鎖,那么它就有權(quán)訪問所有在該管程對象上同步的塊。下面這個鎖的實現(xiàn)是不可重入的如果一個線程在兩次調(diào)用間沒有調(diào)用方法,那么第二次調(diào)用就會被阻塞,這就出現(xiàn)了重入鎖死。

重入鎖死與死鎖和嵌套管程鎖死非常相似。鎖和讀寫鎖兩篇文章中都有涉及到重入鎖死的問題。

當(dāng)一個線程重新獲取鎖,讀寫鎖或其他不可重入的同步器時,就可能發(fā)生重入鎖死??芍厝氲囊馑际蔷€程可以重復(fù)獲得它已經(jīng)持有的鎖。Java的synchronized塊是可重入的。因此下面的代碼是沒問題的:

(譯者注:這里提到的鎖都是指的不可重入的鎖實現(xiàn),并不是Java類庫中的Lock與ReadWriteLock類)

public class Reentrant{
    public synchronized outer(){
        inner();
    }

    public synchronized inner(){
        //do something
    }
}

注意outer()和inner()都聲明為synchronized,這在Java中這相當(dāng)于synchronized(this)塊(譯者注:這里兩個方法是實例方法,synchronized的實例方法相當(dāng)于在this上加鎖,如果是static方法,則不然,更多閱讀:哪個對象才是鎖?)。如果某個線程調(diào)用了outer(),outer()中的inner()調(diào)用是沒問題的,因為兩個方法都是在同一個管程對象(即this)上同步的。如果一個線程持有某個管程對象上的鎖,那么它就有權(quán)訪問所有在該管程對象上同步的塊。這就叫可重入。若線程已經(jīng)持有鎖,那么它就可以重復(fù)訪問所有使用該鎖的代碼塊。

下面這個鎖的實現(xiàn)是不可重入的:

public class Lock{
    private boolean isLocked = false;
    public synchronized void lock()
        throws InterruptedException{
        while(isLocked){
            wait();
        }
        isLocked = true;
    }

    public synchronized void unlock(){
        isLocked = false;
        notify();
    }
}

如果一個線程在兩次調(diào)用lock()間沒有調(diào)用unlock()方法,那么第二次調(diào)用lock()就會被阻塞,這就出現(xiàn)了重入鎖死。

避免重入鎖死有兩個選擇:

編寫代碼時避免再次獲取已經(jīng)持有的鎖

使用可重入鎖

至于哪個選擇最適合你的項目,得視具體情況而定??芍厝腈i通常沒有不可重入鎖那么好的表現(xiàn),而且實現(xiàn)起來復(fù)雜,但這些情況在你的項目中也許算不上什么問題。無論你的項目用鎖來實現(xiàn)方便還是不用鎖方便,可重入特性都需要根據(jù)具體問題具體分析。

原文 Reentrance Lockout
作者 Jakob Jenkov
譯者 劉曉日
校對 丁一
via ifeve

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

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

相關(guān)文章

  • 線程安全

    摘要:不可變在中,不可變的對象一定是線程安全的。在里標(biāo)注自己是線程安全的類,大多都不是絕對線程安全,比如某些情況下類在調(diào)用端也需要額外的同步措施。無同步方案要保證線程安全,不一定就得需要數(shù)據(jù)的同步,兩者沒有因果關(guān)系。 在之前學(xué)習(xí)編程的時候,有一個概念根深蒂固,即程序=算法+數(shù)據(jù)結(jié)構(gòu)。數(shù)據(jù)代表問題空間中的客體,代碼就用來處理這些數(shù)據(jù),這種思維是站在計算機的角度去抽象問題和解決問題,稱之為面向過...

    fuyi501 評論0 收藏0
  • java-實戰(zhàn)java高并發(fā)程序設(shè)計-ch1走入并行的世界

    摘要:參考何去何從的并行計算忘記該死的并行并行程序的復(fù)雜性和亂序性,并行程序設(shè)計十分復(fù)雜??膳碌默F(xiàn)實摩爾定律的失效單核上的晶體管數(shù)目達(dá)到極限。并發(fā)級別阻塞重入鎖無饑餓兩個線程優(yōu)先級不同,低優(yōu)先級的可能產(chǎn)生饑餓。 Chapter1 參考:https://github.com/chengbingh... 1.1何去何從的并行計算 1.1.1 忘記該死的并行并行程序的復(fù)雜性和亂序性,并行程序設(shè)計十...

    suxier 評論0 收藏0
  • [學(xué)習(xí)筆記-Java集合-7] Map - ConcurrentHashMap 源碼分析(一)

    摘要:簡介是的線程安全版本,內(nèi)部也是使用數(shù)組鏈表紅黑樹的結(jié)構(gòu)來存儲元素。相比于同樣線程安全的來說,效率等各方面都有極大地提高。中的關(guān)鍵字,內(nèi)部實現(xiàn)為監(jiān)視器鎖,主要是通過對象監(jiān)視器在對象頭中的字段來表明的。 簡介 ConcurrentHashMap是HashMap的線程安全版本,內(nèi)部也是使用(數(shù)組 + 鏈表 + 紅黑樹)的結(jié)構(gòu)來存儲元素。 相比于同樣線程安全的HashTable來說,效率等各方...

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

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

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

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

    番茄西紅柿 評論0 收藏0

發(fā)表評論

0條評論

LeexMuller

|高級講師

TA的文章

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