jvm锁_JVM如何处理锁
生活随笔
收集整理的這篇文章主要介紹了
jvm锁_JVM如何处理锁
小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
jvm鎖
當(dāng)我們談?wù)撟钚掳姹镜腟un Hotspot Java虛擬機(jī)1.6時(shí),當(dāng)您嘗試從java.util.concurrent.locks.Lock實(shí)現(xiàn)獲取鎖或輸入同步塊時(shí),JVM將執(zhí)行以下三種鎖類型:- 有偏見(jiàn)的 :有時(shí),即使在并發(fā)系統(tǒng)中也沒(méi)有爭(zhēng)用,并且在這種情況下,JVM不應(yīng)從OS借用互斥鎖來(lái)執(zhí)行鎖定。 Hotspot可以使用其自己的內(nèi)部數(shù)據(jù)結(jié)構(gòu)進(jìn)行操作,以更有效的方式模擬鎖定。 例如,如果代碼的同步部分沒(méi)有實(shí)時(shí)并發(fā)執(zhí)行,則JVM使用CAS操作將所有者線程ID分配給Java代碼中用作互斥對(duì)象的對(duì)象,并在傳遞CAS時(shí)另外存儲(chǔ)重入計(jì)數(shù)。 它是有偏鎖 -JVM完成的“最輕”的鎖類型。 重入計(jì)數(shù)將由鎖所有者線程更新,就像沒(méi)有CAS的通常本地變量一樣。 如果CAS失敗,則意味著另一個(gè)線程已經(jīng)獲得了該鎖,在這種情況下,JVM 停止了互斥體所有者線程, 將線程上下文刷新到主內(nèi)存中并檢查重入計(jì)數(shù)。 如果為0,則JVM會(huì)將鎖升級(jí)為瘦類型,否則升級(jí)為胖 (我認(rèn)為主要目的是等待時(shí)間,如果鎖很薄,則應(yīng)該很小)。 注意 Hotspot使用與用于緩存標(biāo)識(shí)哈希碼相同的字段在互斥對(duì)象中存儲(chǔ)所有者線程ID。 因此,如果您一次在互斥體上檢索身份哈希碼,那么即使已被用作偏向鎖定,它也無(wú)法用于偏向鎖定。 有關(guān)偏向鎖的更多信息,請(qǐng)參見(jiàn)David Dice的博客 。
- 薄 :這是一個(gè)簡(jiǎn)單的自旋鎖。 當(dāng)旋轉(zhuǎn)時(shí)間很小時(shí),它有助于節(jié)省線程上下文切換的時(shí)間。 當(dāng)一個(gè)線程嘗試獲取占用的互斥鎖時(shí),它將旋轉(zhuǎn)一段時(shí)間,直到釋放鎖為止。 旋轉(zhuǎn)次數(shù)基于內(nèi)部JVM分辨率,并且可能取決于不同的因素:JVM收集的有關(guān)您的應(yīng)用程序的統(tǒng)計(jì)信息,使用的線程數(shù),CPU等等。 JVM確定精簡(jiǎn)鎖何時(shí)變得無(wú)效,并將其升級(jí)為胖鎖。
- fat :JVM請(qǐng)求操作系統(tǒng)互斥并使用OS調(diào)度程序引擎進(jìn)行線程駐留和喚醒時(shí),“最強(qiáng)”的鎖定類型。 它比以前的類型昂貴得多,因?yàn)樵谶@種情況下,每當(dāng)線程獲取并釋放鎖時(shí),JVM都應(yīng)直接與OS交互。
參考: JVM如何處理 Slava技術(shù)博客上的 JCG合作伙伴提供的鎖 。
相關(guān)文章 :- Erlang與Java內(nèi)存架構(gòu)
- Java Fork / Join進(jìn)行并行編程
- Java內(nèi)存模型-快速概述和注意事項(xiàng)
- Java中可怕的雙重檢查鎖定習(xí)慣用法
- Java最佳實(shí)踐–隊(duì)列之戰(zhàn)和鏈接的ConcurrentHashMap
翻譯自: https://www.javacodegeeks.com/2011/05/how-jvm-handle-locks.html
jvm鎖
創(chuàng)作挑戰(zhàn)賽新人創(chuàng)作獎(jiǎng)勵(lì)來(lái)咯,堅(jiān)持創(chuàng)作打卡瓜分現(xiàn)金大獎(jiǎng)總結(jié)
以上是生活随笔為你收集整理的jvm锁_JVM如何处理锁的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: JBoss BPM Travel Age
- 下一篇: JBoss BPM Travel Age