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

資訊專欄INFORMATION COLUMN

Java 同步鎖

xi4oh4o / 1157人閱讀

摘要:如果同一個線程再次請求該鎖,計數(shù)器會遞增,每次占有的線程退出同步代碼塊時計數(shù)器會遞減,直至減為時鎖才會被釋放。表示或在該上的所有線程的個數(shù)用來實現(xiàn)重入鎖的計數(shù)。只有兩種可能的值表示沒有需要喚醒的線程表示要喚醒一個繼任線程來競爭鎖。

一、synchronized

1.類型

(1)對象鎖

對象鎖是作用在實例方法或者一個對象實例上面的

一個類可以有多個實例對象,因此一個類的對象鎖可能會有多個

例子:

Account account = new Account();
synchronized(account){
    ....
}

(2)類鎖

而類鎖是作用在靜態(tài)方法或者Class對象上面的

每個類只有一個Class對象,所以類鎖只有一個

類鎖只是一個概念上的東西,并不是真實存在的,它只是用來幫助我們理解鎖定的是實例方法還是靜態(tài)方法區(qū)別的

例子:

synchronized(Account.class){
    ....
}

2.synchronizedd的使用:

(1)鎖對象的引用,以及這個鎖保護的代碼塊。

例子:

private Object obj = new Objcet();
publci void test(){
    synchronized(obj){
    ....
    }
}

(2)如果作用在實例方法上面,鎖就是該方法所在的當前對象,靜態(tài)synchronized方法會從Class對象上獲得鎖。

例子:

public synchronized void test(){
    ....
}

(3)究竟是synchronized方法好還是synchronized代碼塊好呢?

有一個原則就是鎖的范圍越小越好,加鎖的目的就是將鎖進去的代碼作為原子性操作,因為非原子操作都不是線程安全的,因此synchronized代碼塊應該是在開發(fā)過程中優(yōu)先考慮使用的加鎖方式。

3.synchronizedd特性

(1)synchronizedd是一種悲觀鎖,也稱為獨占鎖,會導致其它所有需要鎖的線程掛起,等待持有鎖的線程釋放鎖。

(2)synchronized不具有繼承性。

如果父類 、子類中存在同樣的方法。父類方法是同步的,子類是不同步的。那么子類的方法就不會無法繼承父類的方法性質(zhì)。必須自己加上synchronized關鍵字!

例子:

class A{
    public synchronized void test(){
        System.out.println("父類");
    }
}
class B extends A{
    public void test(){
        System.out.println("子類無法繼承父類的鎖");
    }
}

(3)重入性

關鍵字synchronized具有鎖重入功能,當一個線程已經(jīng)持有一個對象鎖后,再次請求該對象鎖時是可以得到該對象的鎖的,這種方式是必須的,否則在一個synchronized方法內(nèi)部就沒有辦法調(diào)用該對象的另外一個synchronized方法了。鎖重入是通過為每個所關聯(lián)一個計數(shù)器和一個占有它的線程,當計數(shù)器為0時,認為鎖是未被占有的。線程請求一個未被占有的鎖時,JVM會記錄鎖的占有者,并將計數(shù)器設置為1。如果同一個線程再次請求該鎖,計數(shù)器會遞增,每次占有的線程退出同步代碼塊時計數(shù)器會遞減,直至減為0時鎖才會被釋放。

4.實現(xiàn)原理

(1)Java對象頭

synchronized用的鎖是存在Java對象頭里的,那么什么是Java對象頭呢?Hotspot虛擬機的對象頭主要包括兩部分數(shù)據(jù):Mark Word(標記字段)、Klass Pointer(類型指針)。

Mark Word(標記字段)

Mark Word用于存儲對象自身的運行時數(shù)據(jù),如哈希碼(HashCode)、GC分代年齡、鎖狀態(tài)標志、線程持有的鎖、偏向線程 ID、偏向時間戳等等。

Klass Pointer(類型指針)

Klass Pointer是對象指向它的類元數(shù)據(jù)的指針,虛擬機通過這個指針來確定這個對象是哪個類的實例,

(2)Monitor Record

Monitor Record 是線程私有的數(shù)據(jù)結構,每一個線程都有一個可用monitor record(監(jiān)視記錄)列表,同時還有一個全局的可用列表。每一個被鎖住的對象都和一個monitor關聯(lián)(對象頭的MarkWord中的LockWord指向monitor的起始地址),同時monitor中有一個Owner字段存放擁有該鎖的線程的唯一標識。

Monitor Record 其結構如下:

Owner: 初始時為NULL表示當前沒有任何線程擁有該monitor record,當線程成功擁有該鎖后保存線程唯一標識,當鎖被釋放時又設置為NULL;

EntryQ:關聯(lián)一個系統(tǒng)互斥鎖(semaphore),阻塞所有試圖鎖住monitor record失敗的線程。

RcThis:表示blocked或waiting在該monitor record上的所有線程的個數(shù)

Nest:用來實現(xiàn)重入鎖的計數(shù)。

HashCode:保存從對象頭拷貝過來的HashCode值(可能還包含GC age)

Candidate:用來避免不必要的阻塞或等待線程喚醒,因為每一次只有一個線程能夠成功擁有鎖,如果每次前一個釋放鎖的線程喚醒所有正在阻塞或等待的線程,會引起不必要的上下文切換(從阻塞到就緒然后因為競爭鎖失敗又被阻塞)從而導致性能嚴重下降。Candidate只有兩種可能的值0表示沒有需要喚醒的線程1表示要喚醒一個繼任線程來競爭鎖。

同步代碼塊

monitorenter指令插入到同步代碼塊的開始位置,monitorexit指令插入到同步代碼塊的結束位置,JVM需要保證每一個monitorenter都有一個monitorexit與之相對應。任何對象都有一個monitor與之相關聯(lián),當且一個monitor被持有之后,他將處于鎖定狀態(tài)。線程執(zhí)行到monitorenter指令時,將會嘗試獲取對象所對應的monitor所有權,即嘗試獲取對象的鎖。

同步方法:

synchronized方法則會被翻譯成普通的方法調(diào)用和返回指令如:invokevirtual、areturn指令,在VM字節(jié)碼層面并沒有任何特別的指令來實現(xiàn)被synchronized修飾的方法,而是在Class文件的方法表中將該方法的access_flags字段中的synchronized標志位置1,表示該方法是同步方法并使用調(diào)用該方法的對象或該方法所屬的Class在JVM的內(nèi)部對象表示Klass做為鎖對象。

二、ReentrantLock

1.輪詢鎖的和定時鎖

可輪詢和可定時的鎖請求是通過tryLock()方法實現(xiàn)的,和無條件獲取鎖不一樣. ReentrantLock可以有靈活的容錯機制.死鎖的很多情況是由于順序鎖引起的, 不同線程在試圖獲得鎖的時候阻塞,并且不釋放自己已經(jīng)持有的鎖, 最后造成死鎖. tryLock()方法在試圖獲得鎖的時候,如果該鎖已經(jīng)被其它線程持有,則按照設置方式立刻返回,而不是一直阻塞等下去,同時在返回后釋放自己持有的鎖.可以根據(jù)返回的結果進行重試或者取消,進而避免死鎖的發(fā)生。

2.公平性

ReentrantLock構造函數(shù)中提供公平性鎖和非公平鎖(默認)兩種選擇。所謂公平鎖,線程將按照他們發(fā)出請求的順序來獲取鎖,不允許插隊;但在非公平鎖上,則允許插隊:當一個線程發(fā)生獲取鎖的請求的時刻,如果這個鎖是可用的,那這個線程將跳過所在隊列里等待線程并獲得鎖。我們一般希望所有鎖是非公平的。因為當執(zhí)行加鎖操作時,公平性將講由于線程掛起和恢復線程時開銷而極大的降低性能。考慮這么一種情況:A線程持有鎖,B線程請求這個鎖,因此B線程被掛起;A線程釋放這個鎖時,B線程將被喚醒,因此再次嘗試獲取鎖;與此同時,C線程也請求獲取這個鎖,那么C線程很可能在B線程被完全喚醒之前獲得、使用以及釋放這個鎖。這是種雙贏的局面,B獲取鎖的時刻(B被喚醒后才能獲取鎖)并沒有推遲,C更早地獲取了鎖,并且吞吐量也獲得了提高。在大多數(shù)情況下,非公平鎖的性能要高于公平鎖的性能。

3.可中斷獲鎖獲取操作

lockInterruptibly方法能夠在獲取鎖的同時保持對中斷的響應,因此無需創(chuàng)建其它類型的不可中斷阻塞操作。

4.Condition

Lock提供的線程之間交互類:

await:阻塞線程

signal:釋放阻塞的線程

signalAll:釋放所有阻塞的線程

5.ReadWriteLock

(1)ReentrantLock是一種標準的互斥鎖,每次最多只有一個線程能持有鎖。讀寫鎖不一樣,暴露了兩個Lock對象,其中一個用于讀操作,而另外一個用于寫操作。

(2)ReentrantReadWriteLock

ReentrantReadWriteLock實現(xiàn)了ReadWriteLock接口,構造器提供了公平鎖和非公平鎖兩種創(chuàng)建方式。讀寫鎖適用于讀多寫少的情況,可以實現(xiàn)更好的并發(fā)性,性能高于重入鎖。

ReadLock:讀鎖

WriteLock:寫鎖

6.ReentrantLock特性

(1)ReentrantLock是可重入的鎖,它不同于內(nèi)置鎖, 它在每次使用都需要顯示的加鎖和解鎖, 而且提供了更高級的特性:公平鎖, 定時鎖, 有條件鎖, 可輪詢鎖, 可中斷鎖. 可以有效避免死鎖的活躍性問題.ReentrantLock實現(xiàn)了。

(2)ReentrantLock是一種樂觀鎖。

7.實現(xiàn)原理

(1)ReentrantLock的方法都依賴于AbstractQueuedSynchronizer的實現(xiàn) (AQS)

(2)ReentrantLock的鎖資源以state狀態(tài)描述,利用CAS則實現(xiàn)對鎖資源的搶占,并通過一個CLH隊列阻塞所有競爭線程,在后續(xù)則逐個喚醒等待中的競爭線程。ReentrantLock繼承AQS完全從代碼層面實現(xiàn)了java的同步機制,相對于synchronized,更容易實現(xiàn)對各類鎖的擴展。同時,AbstractQueuedSynchronizer中的Condition配合ReentrantLock使用,實現(xiàn)了wait/notify的功能

部分信息來自網(wǎng)絡

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

轉(zhuǎn)載請注明本文地址:http://specialneedsforspecialkids.com/yun/71429.html

相關文章

  • Java中的

    摘要:當前線程在超時時間內(nèi)被中斷超時時間結束,返回釋放鎖獲取等待通知組件,該組件和當前的鎖綁定,當前線程只有獲取了鎖,才能調(diào)用該組件的方法,調(diào)用后,當前線程將釋放鎖。同步器是實現(xiàn)鎖的關鍵,在鎖的實現(xiàn)中聚合同步器,利用同步器實現(xiàn)鎖的語義。 本文在參考java并發(fā)編程實戰(zhàn)后完成,參考內(nèi)容較多 Java中的鎖 鎖是用來控制多線程訪問共享資源的方式,一個鎖能夠防止多個線程同事訪問共享資源。在Lock...

    gaara 評論0 收藏0
  • Java中的以及sychronized實現(xiàn)機制

    摘要:有可能,會造成優(yōu)先級反轉(zhuǎn)或者饑餓現(xiàn)象。悲觀鎖在中的使用,就是利用各種鎖。對于而言,其是獨享鎖。偏向鎖,顧名思義,它會偏向于第一個訪問鎖的線程,大多數(shù)情況下鎖不僅不存在多線程競爭,而且總是由同一線程多次獲得。 理解鎖的基礎知識 如果想要透徹的理解java鎖的來龍去脈,需要先了解以下基礎知識。 基礎知識之一:鎖的類型 按照其性質(zhì)分類 公平鎖/非公平鎖 公平鎖是指多個線程按照申請鎖的順序來獲...

    linkin 評論0 收藏0
  • java并發(fā)機制與底層實現(xiàn)原理

    摘要:并發(fā)機制與底層實現(xiàn)原理是輕量級的它在多處理器開發(fā)中保證了共享變量的可見性,因為它不會引起線程上下文的切換和調(diào)度,所以比的使用和執(zhí)行成本更底。如果線程間存在鎖競爭,會帶來額外的鎖撤銷的消耗。輕量級鎖競爭的線程不會阻塞,提高了程序的響應速度。 java并發(fā)機制與底層實現(xiàn)原理 volatile volatile是輕量級的synchronize,它在多處理器開發(fā)中保證了共享變量的可見性,因為它...

    scola666 評論0 收藏0
  • Java 重入 ReentrantLock 原理分析

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

    lx1036 評論0 收藏0
  • Java并發(fā)編程筆記(二)

    摘要:本文探討并發(fā)中的其它問題線程安全可見性活躍性等等。當閉鎖到達結束狀態(tài)時,門打開并允許所有線程通過。在從返回時被叫醒時,線程被放入鎖池,與其他線程競爭重新獲得鎖。 本文探討Java并發(fā)中的其它問題:線程安全、可見性、活躍性等等。 在行文之前,我想先推薦以下兩份資料,質(zhì)量很高:極客學院-Java并發(fā)編程讀書筆記-《Java并發(fā)編程實戰(zhàn)》 線程安全 《Java并發(fā)編程實戰(zhàn)》中提到了太多的術語...

    NickZhou 評論0 收藏0
  • JAVA多線程機制解析-volatile&synchronized

    摘要:當一個線程持有重量級鎖時,另外一個線程就會被直接踢到同步隊列中等待。 java代碼先編譯成字節(jié)碼,字節(jié)碼最后編譯成cpu指令,因此Java的多線程實現(xiàn)最終依賴于jvm和cpu的實現(xiàn) synchronized和volatile 我們先來討論一下volatile關鍵字的作用以及實現(xiàn)機制,每個線程看到的用volatile修飾的變量的值都是最新的,更深入的解釋就涉及到Java的內(nèi)存模型了,我們...

    dendoink 評論0 收藏0

發(fā)表評論

0條評論

xi4oh4o

|高級講師

TA的文章

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