五月天青色头像情侣网名,国产亚洲av片在线观看18女人,黑人巨茎大战俄罗斯美女,扒下她的小内裤打屁股

歡迎光臨散文網(wǎng) 會員登陸 & 注冊

JVM對Java的原生鎖做了哪些優(yōu)化?

2023-05-31 09:48 作者:云和數(shù)據(jù)何老師  | 我要投稿


JVM對Java的原生鎖(即synchronized關(guān)鍵字)做了許多優(yōu)化,其中包括:

1.偏向鎖(Biased Locking)

當(dāng)一個(gè)線程獲取鎖后,JVM會將鎖的對象頭標(biāo)記為偏向鎖。此時(shí),該線程可以無需競爭地獲取該鎖。這種情況下,鎖的獲取和釋放不需要額外的開銷,因?yàn)槠蜴i會記錄線程ID,使得在該線程持有鎖期間,其他線程無法獲取該鎖。只有在其他線程嘗試獲取鎖時(shí),才會升級為輕量級鎖。

2.輕量級鎖(Lightweight Locking)

當(dāng)多個(gè)線程爭奪鎖時(shí),JVM會將鎖標(biāo)記為輕量級鎖。此時(shí),JVM會在鎖對象的對象頭中記錄指向線程棧中鎖記錄的指針,以及用于保存原始對象的指針。這樣,當(dāng)一個(gè)線程嘗試獲取該鎖時(shí),JVM會將該線程的棧幀中的鎖記錄與鎖對象頭中的指針進(jìn)行比較。如果相同,則表示該線程已經(jīng)獲得了該鎖;否則,JVM會使用CAS操作嘗試將鎖對象頭中的指針指向當(dāng)前線程的鎖記錄。如果CAS操作成功,表示當(dāng)前線程成功獲得了鎖。否則,表示有其他線程爭奪該鎖,此時(shí)JVM會將鎖升級為重量級鎖。

3.重量級鎖(Heavyweight Locking)

當(dāng)多個(gè)線程爭奪鎖時(shí),如果無法獲得鎖,則會升級為重量級鎖。此時(shí),JVM會使用操作系統(tǒng)的互斥量實(shí)現(xiàn)鎖。重量級鎖的開銷非常大,因?yàn)樾枰M(jìn)行用戶態(tài)與內(nèi)核態(tài)之間的上下文切換。

下面是一個(gè)簡單的代碼演示,展示了偏向鎖、輕量級鎖和重量級鎖的使用情況。

public class SynchronizedDemo { ? ?private int count = 0; ? ?public synchronized void increment() { ? ? ? ?count++; ? ?} ? ?public static void main(String[] args) { ? ? ? ?SynchronizedDemo demo = new SynchronizedDemo(); ? ? ? ?for (int i = 0; i < 100000; i++) { ? ? ? ? ? ?demo.increment(); ? ? ? ?} ? ? ? ?System.out.println(demo.count); ? ?}}

在這個(gè)示例中,我們使用synchronized關(guān)鍵字來對increment()方法進(jìn)行同步。由于該方法是實(shí)例方法,因此鎖對象是該實(shí)例對象。當(dāng)多個(gè)線程同時(shí)訪問該方法時(shí),JVM會根據(jù)鎖的狀態(tài)來選擇使用偏向鎖、輕量級鎖或重量級鎖。具體的選擇過程是由JVM內(nèi)部的鎖升級算法來決定的,這里不再詳細(xì)展開。


JVM對Java的原生鎖做了哪些優(yōu)化?的評論 (共 條)

分享到微博請遵守國家法律
沁水县| 石泉县| 亳州市| 罗平县| 霍城县| 桂东县| 柞水县| 玉门市| 平乡县| 行唐县| 海淀区| 明星| 宕昌县| 靖远县| 台东市| 灵丘县| 宁蒗| 麻栗坡县| 威远县| 莒南县| 明光市| 张家口市| 湛江市| 沂南县| 合阳县| 连平县| 南靖县| 威远县| 上思县| 芮城县| 青神县| 靖边县| 哈尔滨市| 马龙县| 铁岭市| 土默特右旗| 营山县| 青神县| 田阳县| 工布江达县| 雅安市|