国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

Java重入鎖死簡介

LeexMuller / 1937人閱讀

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

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

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

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

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

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

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

下面這個鎖的實現是不可重入的:

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();
    }
}

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

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

編寫代碼時避免再次獲取已經持有的鎖

使用可重入鎖

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

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

文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。

轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/64075.html

相關文章

  • 線程安全

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

    fuyi501 評論0 收藏0
  • java-實戰java高并發程序設計-ch1走入并行的世界

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

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

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

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

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

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

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

    番茄西紅柿 評論0 收藏0

發表評論

0條評論

LeexMuller

|高級講師

TA的文章

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