国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

Synchronized同步鎖的優(yōu)化方法 待完工

這篇具有很好參考價(jià)值的文章主要介紹了Synchronized同步鎖的優(yōu)化方法 待完工。希望對(duì)大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請(qǐng)大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問(wèn)。

Synchronized 和后來(lái)出的這個(gè)lock鎖的區(qū)別

在并發(fā)編程中,多個(gè)線(xiàn)程訪(fǎng)問(wèn)同一個(gè)共享資源時(shí),我們必須考慮如何維護(hù)數(shù)據(jù)的原子性。在
JDK1.5 之前,Java 是依靠 Synchronized 關(guān)鍵字實(shí)現(xiàn)鎖功能來(lái)做到這點(diǎn)的。Synchronized 是 JVM 實(shí)現(xiàn)的一種內(nèi)置鎖,鎖的獲取和釋放是由 JVM 隱式實(shí)現(xiàn)。

到了 JDK1.5 版本,并發(fā)包中新增了 Lock 接口來(lái)實(shí)現(xiàn)鎖功能,它提供了與 Synchronized
關(guān)鍵字類(lèi)似的同步功能,只是在使用時(shí)需要顯示獲取和釋放鎖

Lock 同步鎖是基于 Java 實(shí)現(xiàn)的,而 Synchronized 是基于底層操作系統(tǒng)的 Mutex Lock
實(shí)現(xiàn)的,每次獲取和釋放鎖操作都會(huì)帶來(lái)用戶(hù)態(tài)和內(nèi)核態(tài)的切換,從而增加系統(tǒng)性能開(kāi)銷(xiāo)

因此,在鎖競(jìng)爭(zhēng)激烈的情況下,Synchronized 同步鎖在性能上就表現(xiàn)得非常糟糕,它也常
被大家稱(chēng)為重量級(jí)鎖。

1.6以后呢對(duì)這個(gè)Synchronized 鎖進(jìn)行了升級(jí),引入了鎖升級(jí),某些程度上來(lái)說(shuō)呢。再某些業(yè)務(wù)場(chǎng)景已經(jīng)超過(guò)了lock。

這里再次生明Synchronized 是關(guān)鍵字,而lock是通過(guò)是西安這個(gè)lock接口來(lái)實(shí)現(xiàn)這個(gè)所功能的。

Synchronized 底層原理 ,也就是他的同步原理

通常 Synchronized 實(shí)現(xiàn)同步鎖的方式有兩種,一種是修飾方法,一種是修飾方法塊。以
下就是通過(guò) Synchronized 實(shí)現(xiàn)的兩種同步方法加鎖的方式:

Synchronized同步鎖的優(yōu)化方法 待完工,并發(fā),java

?javac -encoding UTF-8 SyncTest.java // 先運(yùn)行編譯 class 文件命令

javap -v SyncTest.class // 再通過(guò) javap 打印出字節(jié)文件

通過(guò)以上命令去反編譯出這個(gè)文件的字節(jié)碼文件可以看到

你會(huì)發(fā)現(xiàn):Synchronized 在修飾同步代碼塊時(shí),是由 monitorenter和 monitorexit 指令來(lái)實(shí)現(xiàn)同步的。進(jìn)入 monitorenter 指令后,線(xiàn)程將持有 Monitor 對(duì)象,退出 monitorenter 指令后,線(xiàn)程將釋放該 Monitor 對(duì)象。注意修飾的代碼塊

而同步方法的字節(jié)碼中,你會(huì)發(fā)現(xiàn):當(dāng) Synchronized 修飾同步方法時(shí),并沒(méi)有發(fā)
現(xiàn) monitorenter 和 monitorexit 指令,而是出現(xiàn)了一個(gè) ACC_SYNCHRONIZED 標(biāo)志。

這是因?yàn)?JVM 使用了 ACC_SYNCHRONIZED 訪(fǎng)問(wèn)標(biāo)志來(lái)區(qū)分一個(gè)方法是否是同步方法

當(dāng)方法調(diào)用時(shí),調(diào)用指令將會(huì)檢查該方法是否被設(shè)置 ACC_SYNCHRONIZED 訪(fǎng)問(wèn)標(biāo)志。
如果設(shè)置了該標(biāo)志,執(zhí)行線(xiàn)程將先持有 Monitor 對(duì)象,然后再執(zhí)行方法。在該方法運(yùn)行期
間,其它線(xiàn)程將無(wú)法獲取到該 Mointor 對(duì)象,當(dāng)方法執(zhí)行完成后,再釋放該 Monitor 對(duì)
象。

?再來(lái)看看 Synchronized 修飾方法是怎么實(shí)現(xiàn)鎖原理的。

JVM 中的同步是基于進(jìn)入和退出管程(Monitor)對(duì)象實(shí)現(xiàn)的。每個(gè)對(duì)象實(shí)例都會(huì)有一個(gè)
Monitor,Monitor 可以和對(duì)象一起創(chuàng)建、銷(xiāo)毀。

當(dāng)多個(gè)線(xiàn)程同時(shí)訪(fǎng)問(wèn)一段同步代碼時(shí),多個(gè)線(xiàn)程會(huì)先被存放在 EntryList 集合中,處于
block 狀態(tài)的線(xiàn)程,都會(huì)被加入到該列表。接下來(lái)當(dāng)線(xiàn)程獲取到對(duì)象的 Monitor 時(shí),
Monitor 是依靠底層操作系統(tǒng)的 Mutex Lock 來(lái)實(shí)現(xiàn)互斥的,線(xiàn)程申請(qǐng) Mutex 成功,則持
有該 Mutex,其它線(xiàn)程將無(wú)法獲取到該 Mutex。

注意閱讀下圖

Synchronized同步鎖的優(yōu)化方法 待完工,并發(fā),java

?如果線(xiàn)程調(diào)用 wait() 方法,就會(huì)釋放當(dāng)前持有的 Mutex,并且該線(xiàn)程會(huì)進(jìn)入 WaitSet 集合
中,等待下一次被喚醒。如果當(dāng)前線(xiàn)程順利執(zhí)行完方法,也將釋放 Mutex。

這里插播一下 wait和sleep都釋放鎖碼?好像寫(xiě)代碼的時(shí)候遇到過(guò)

Synchronized同步鎖的優(yōu)化方法 待完工,并發(fā),java

?因 Monitor 是依賴(lài)于底層的操作系統(tǒng)實(shí)現(xiàn),存在用戶(hù)態(tài)與內(nèi)核態(tài)之間的切換,所以增加了性能開(kāi)銷(xiāo)。

鎖升級(jí)優(yōu)化

為了提升性能,JDK1.6 引入了偏向鎖、輕量級(jí)鎖、重量級(jí)鎖概念,來(lái)減少鎖競(jìng)爭(zhēng)帶來(lái)的上
下文切換,而正是新增的 Java 對(duì)象頭實(shí)現(xiàn)了鎖升級(jí)功能。
當(dāng) Java 對(duì)象被 Synchronized 關(guān)鍵字修飾成為同步鎖后,圍繞這個(gè)鎖的一系列升級(jí)操作都
將和 Java 對(duì)象頭有關(guān)。

Java 對(duì)象頭

在 JDK1.6 JVM 中,對(duì)象實(shí)例在堆內(nèi)存中被分為了三個(gè)部分:對(duì)象頭、實(shí)例數(shù)據(jù)和對(duì)齊填
充。其中 Java 對(duì)象頭由 Mark Word、指向類(lèi)的指針以及數(shù)組長(zhǎng)度三部分組成

Mark Word 記錄了對(duì)象和鎖有關(guān)的信息。Mark Word 在 64 位 JVM 中的長(zhǎng)度是 64bit

Synchronized同步鎖的優(yōu)化方法 待完工,并發(fā),java

?鎖升級(jí)功能主要依賴(lài)于 Mark Word 中的鎖標(biāo)志位和釋放偏向鎖標(biāo)志位,Synchronized 同
步鎖就是從偏向鎖開(kāi)始的,隨著競(jìng)爭(zhēng)越來(lái)越激烈,偏向鎖升級(jí)到輕量級(jí)鎖,最終升級(jí)到重量
級(jí)鎖。

1. 偏向鎖

偏向鎖主要用來(lái)優(yōu)化同一線(xiàn)程多次申請(qǐng)同一個(gè)鎖的競(jìng)爭(zhēng)。在某些情況下,大部分時(shí)間是同一
個(gè)線(xiàn)程競(jìng)爭(zhēng)鎖資源,例如,在創(chuàng)建一個(gè)線(xiàn)程并在線(xiàn)程中執(zhí)行循環(huán)監(jiān)聽(tīng)的場(chǎng)景下,或單線(xiàn)程操
作一個(gè)線(xiàn)程安全集合時(shí),同一線(xiàn)程每次都需要獲取和釋放鎖,每次操作都會(huì)發(fā)生用戶(hù)態(tài)與內(nèi)
核態(tài)的切換。

Synchronized同步鎖的優(yōu)化方法 待完工,并發(fā),java

?再自己的同步代碼塊里加鎖,同步代碼塊有全局變量,我們枷鎖,讓它不被別的線(xiàn)程修改

偏向鎖的作用就是,當(dāng)一個(gè)線(xiàn)程再次訪(fǎng)問(wèn)這個(gè)同步代碼或方法時(shí),該線(xiàn)程只需去對(duì)象頭的
Mark Word 中去判斷一下是否有偏向鎖指向它的 ID,無(wú)需再進(jìn)入 Monitor 去競(jìng)爭(zhēng)對(duì)象
了。

當(dāng)對(duì)象被當(dāng)做同步鎖并有一個(gè)線(xiàn)程搶到了鎖時(shí),鎖標(biāo)志位還是 01,“是否偏向鎖”標(biāo)
志位設(shè)置為 1,并且記錄搶到鎖的線(xiàn)程 ID,表示進(jìn)入偏向鎖狀態(tài)。

一旦出現(xiàn)其它線(xiàn)程競(jìng)爭(zhēng)鎖資源時(shí),偏向鎖就會(huì)被撤銷(xiāo)。偏向鎖的撤銷(xiāo)需要等待全局安全點(diǎn),
暫停持有該鎖的線(xiàn)程,同時(shí)檢查該線(xiàn)程是否還在執(zhí)行該方法,如果是,則升級(jí)鎖,反之則被
其它線(xiàn)程搶占。

下圖中紅線(xiàn)流程部分為偏向鎖獲取和撤銷(xiāo)流程:

Synchronized同步鎖的優(yōu)化方法 待完工,并發(fā),java

偏向鎖這個(gè)設(shè)計(jì)到一個(gè)調(diào)優(yōu) 高并發(fā)

在高并發(fā)場(chǎng)景下,當(dāng)大量線(xiàn)程同時(shí)競(jìng)爭(zhēng)同一個(gè)鎖資源時(shí),偏向鎖就會(huì)被撤銷(xiāo),發(fā)生
stop the world 后, 開(kāi)啟偏向鎖無(wú)疑會(huì)帶來(lái)更大的性能開(kāi)銷(xiāo),這時(shí)我們可以通過(guò)添加 JVM
參數(shù)關(guān)閉偏向鎖來(lái)調(diào)優(yōu)系統(tǒng)性能

Synchronized同步鎖的優(yōu)化方法 待完工,并發(fā),java

如果你確定應(yīng)用程序里所有的鎖通常情況下處于競(jìng)爭(zhēng)狀態(tài),可以通過(guò)JVM參數(shù)關(guān)閉偏向鎖:-XX:-
UseBiasedLocking=false,那么程序默認(rèn)會(huì)進(jìn)入輕量級(jí)鎖狀態(tài)。

2.輕量級(jí)鎖

(1)輕量級(jí)鎖加鎖

????????線(xiàn)程在執(zhí)行同步塊之前,JVM會(huì)先在當(dāng)前線(xiàn)程的棧楨中創(chuàng)建用于存儲(chǔ)鎖記錄的空間,并
將對(duì)象頭中的Mark Word復(fù)制到鎖記錄中,官方稱(chēng)為Displaced Mark Word。然后線(xiàn)程嘗試使用
CAS將對(duì)象頭中的Mark Word替換為指向鎖記錄的指針。如果成功,當(dāng)前線(xiàn)程獲得鎖,如果失
敗,表示其他線(xiàn)程競(jìng)爭(zhēng)鎖,當(dāng)前線(xiàn)程便嘗試使用自旋來(lái)獲取鎖。

(2)輕量級(jí)鎖解鎖

輕量級(jí)解鎖時(shí),會(huì)使用原子的CAS操作將Displaced Mark Word替換回到對(duì)象頭,如果成
功,則表示沒(méi)有競(jìng)爭(zhēng)發(fā)生。如果失敗,表示當(dāng)前鎖存在競(jìng)爭(zhēng),鎖就會(huì)膨脹成重量級(jí)鎖。圖2-2是
兩個(gè)線(xiàn)程同時(shí)爭(zhēng)奪鎖,導(dǎo)致鎖膨脹的流程圖。

Synchronized同步鎖的優(yōu)化方法 待完工,并發(fā),java

?因?yàn)樽孕龝?huì)消耗CPU,為了避免無(wú)用的自旋(比如獲得鎖的線(xiàn)程被阻塞住了),一旦鎖升級(jí)
成重量級(jí)鎖,就不會(huì)再恢復(fù)到輕量級(jí)鎖狀態(tài)。當(dāng)鎖處于這個(gè)狀態(tài)下,其他線(xiàn)程試圖獲取鎖時(shí),
都會(huì)被阻塞住,當(dāng)持有鎖的線(xiàn)程釋放鎖之后會(huì)喚醒這些線(xiàn)程,被喚醒的線(xiàn)程就會(huì)進(jìn)行新一輪
的奪鎖之爭(zhēng)。Synchronized同步鎖的優(yōu)化方法 待完工,并發(fā),java

這里非常重要的一點(diǎn)就是

當(dāng)一個(gè)線(xiàn)程訪(fǎng)問(wèn)同步塊并獲取鎖時(shí),會(huì)在對(duì)象頭和棧幀中的鎖記錄里存儲(chǔ)鎖偏向的線(xiàn)程ID文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-631494.html

到了這里,關(guān)于Synchronized同步鎖的優(yōu)化方法 待完工的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來(lái)自互聯(lián)網(wǎng)用戶(hù)投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場(chǎng)。本站僅提供信息存儲(chǔ)空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請(qǐng)注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請(qǐng)點(diǎn)擊違法舉報(bào)進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • 【并發(fā)多線(xiàn)程】java并發(fā)中的Synchronized關(guān)鍵詞

    如果在多線(xiàn)程的環(huán)境中,我們經(jīng)常會(huì)遇到資源競(jìng)爭(zhēng)的情況,比如多個(gè)線(xiàn)程要去同時(shí)修改同一個(gè)共享變量,這時(shí)候,就需要對(duì)資源的訪(fǎng)問(wèn)方法進(jìn)行一定的處理,保證同一時(shí)間只有一個(gè)線(xiàn)程訪(fǎng)問(wèn)。 java提供了synchronized,方便我們實(shí)現(xiàn)上述操作。 我們舉個(gè)例子,我們創(chuàng)建一個(gè)

    2023年04月13日
    瀏覽(23)
  • 【Java 并發(fā)編程】一文詳解 Java 內(nèi)置鎖 synchronized

    【Java 并發(fā)編程】一文詳解 Java 內(nèi)置鎖 synchronized

    存在共享數(shù)據(jù); 多線(xiàn)程共同操作共享數(shù)。 synchronized 可以保證在同一時(shí)刻,只有一個(gè)線(xiàn)程可以執(zhí)行某個(gè)方法或某個(gè)代碼塊,同時(shí) synchronized 可以保證一個(gè)線(xiàn)程的變化可見(jiàn)(可見(jiàn)性),即可以代替 volatile。 多線(xiàn)程編程中,有可能會(huì)出現(xiàn)多個(gè)線(xiàn)程同時(shí)訪(fǎng)問(wèn)同一個(gè)共享、可變

    2024年02月02日
    瀏覽(24)
  • synchronized 到底鎖的是誰(shuí)?

    synchronized 到底鎖的是誰(shuí)? 修飾方法: 1、靜態(tài)方法 2、非靜態(tài)方法,鎖住的是方法的調(diào)用者 修飾代碼塊 鎖住實(shí)例 流程: 1、線(xiàn)程A先拿到synModel對(duì)象然后給這個(gè) synModel對(duì)象加上鎖–接著等3s執(zhí)行輸出結(jié)束 2、線(xiàn)程B等1s后運(yùn)行,此時(shí) synModel對(duì)象 已經(jīng)被 A拿到,所以他只能等待 等

    2024年02月05日
    瀏覽(26)
  • Java并發(fā)之synchronized關(guān)鍵字和Lock接口

    歡迎點(diǎn)贊閱讀,一同學(xué)習(xí)交流,有疑問(wèn)請(qǐng)留言 。 GitHub上也有開(kāi)源 JavaHouse,歡迎star 當(dāng)開(kāi)發(fā)過(guò)程中,我們遇到并發(fā)問(wèn)題。怎么解決? 一種解決方式,簡(jiǎn)單粗暴:上鎖。將千軍萬(wàn)馬都給攔下來(lái),只允許一個(gè)人過(guò)獨(dú)木橋。書(shū)面意思就是將并行的程序變成串行的程序。現(xiàn)實(shí)的鎖有門(mén)鎖

    2024年02月08日
    瀏覽(21)
  • 【Java|多線(xiàn)程與高并發(fā)】線(xiàn)程安全問(wèn)題以及synchronized使用實(shí)例

    【Java|多線(xiàn)程與高并發(fā)】線(xiàn)程安全問(wèn)題以及synchronized使用實(shí)例

    Java多線(xiàn)程環(huán)境下,多個(gè)線(xiàn)程同時(shí)訪(fǎng)問(wèn)共享資源時(shí)可能出現(xiàn)的數(shù)據(jù)競(jìng)爭(zhēng)和不一致的情況。 線(xiàn)程安全一直都是一個(gè)令人頭疼的問(wèn)題.為了解決這個(gè)問(wèn)題,Java為我們提供了很多方式. synchronized、ReentrantLock類(lèi)等。 使用線(xiàn)程安全的數(shù)據(jù)結(jié)構(gòu),例如ConcurrentHashMap、ConcurrentLinkedQueue等

    2024年02月09日
    瀏覽(14)
  • 多線(xiàn)程Synchronized鎖的使用與線(xiàn)程之間的通訊

    多線(xiàn)程Synchronized鎖的使用與線(xiàn)程之間的通訊

    多線(xiàn)程同時(shí)對(duì)同一個(gè)全局變量做寫(xiě)操作,可能會(huì)受到其他線(xiàn)程的干擾,就會(huì)發(fā)生線(xiàn)程安全問(wèn)題。 Java中的全局變量是存放在堆內(nèi)存中的,而堆內(nèi)容對(duì)于所有線(xiàn)程來(lái)說(shuō)是共享的。 比如下面一個(gè)簡(jiǎn)單的代碼案例: 代碼比較簡(jiǎn)單,我們看下面控制臺(tái)的打?。?可以看到兩個(gè)線(xiàn)程之間

    2024年02月04日
    瀏覽(20)
  • Java中synchronized的優(yōu)化

    Java中synchronized的優(yōu)化

    本文介紹為了實(shí)現(xiàn)高效并發(fā),虛擬機(jī)對(duì) synchronized 做的一系列的鎖優(yōu)化措施 高效并發(fā)是從 JDK5 升級(jí)到 JDK6 后一項(xiàng)重要的改進(jìn)項(xiàng),HotSpot 虛擬機(jī)開(kāi)發(fā)團(tuán)隊(duì)在 JDK6 這個(gè)版本上花費(fèi)了大量的資源去實(shí)現(xiàn)各種鎖優(yōu)化技術(shù),如適應(yīng)性自旋(Adaptive Spinning)、鎖消除(Lock Elimination)、鎖膨

    2024年02月04日
    瀏覽(24)
  • Java 中 synchronized 的優(yōu)化操作:鎖升級(jí)、鎖消除、鎖粗化

    Java 中 synchronized 的優(yōu)化操作:鎖升級(jí)、鎖消除、鎖粗化

    由 并發(fā)編程中常見(jiàn)的鎖策略 總結(jié)可知,synchronized 具有以下幾個(gè)特性: 開(kāi)始時(shí)是樂(lè)觀鎖,如果鎖沖突頻繁,就轉(zhuǎn)換為悲觀鎖。 開(kāi)始是輕量級(jí)鎖實(shí)現(xiàn),如果鎖被持有的時(shí)間較長(zhǎng),就轉(zhuǎn)換成重量級(jí)鎖。 實(shí)現(xiàn)輕量級(jí)鎖時(shí),大概率用自旋鎖策略。 是一種不公平鎖。 是一種可重入鎖

    2024年02月16日
    瀏覽(20)
  • 【Java練習(xí)題匯總】《第一行代碼JAVA》多線(xiàn)程篇,匯總Java練習(xí)題——線(xiàn)程及多線(xiàn)程概念、Thread 類(lèi)及 Runnable 接口、線(xiàn)程狀態(tài)、synchronized同步操作...

    【Java練習(xí)題匯總】《第一行代碼JAVA》多線(xiàn)程篇,匯總Java練習(xí)題——線(xiàn)程及多線(xiàn)程概念、Thread 類(lèi)及 Runnable 接口、線(xiàn)程狀態(tài)、synchronized同步操作...

    一、填空題 Java 多線(xiàn)程可以依靠________ 、________ 和________ 三種方式實(shí)現(xiàn)。 多個(gè)線(xiàn)程操作同一資源的時(shí)候需要注意________,依靠________ 實(shí)現(xiàn),實(shí)現(xiàn)手段是:________ 和________,過(guò)多的使用,則會(huì)出現(xiàn)________ 問(wèn)題。 Java 程序運(yùn)行時(shí),至少啟動(dòng)________ 個(gè)線(xiàn)程,分別是________ 和_

    2024年02月16日
    瀏覽(24)
  • 【創(chuàng)作贏紅包】Java多線(xiàn)程:synchronized鎖方法塊

    synchronized同步代碼塊 用synchronized聲明方法在某些情況下是有弊端的,比如A線(xiàn)程調(diào)用同步方法執(zhí)行一個(gè)較長(zhǎng)時(shí)間的任務(wù),那么B線(xiàn)程必須等待比較長(zhǎng)的時(shí)間。這種情況下可以嘗試使用synchronized同步語(yǔ)句塊來(lái)解決問(wèn)題。看一下例子: ??? 運(yùn)行結(jié)果,分兩部分來(lái)看: synchr

    2023年04月09日
    瀏覽(17)

覺(jué)得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請(qǐng)作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包