亚洲福利网站,国产精品久久国产三级国电话系列 ,欧美久久久久久,蜜桃av在线

IT培訓(xùn)-高端面授IT培訓(xùn)機構(gòu)
云和教育:云和數(shù)據(jù)集團高端IT職業(yè)教育品牌
  • 國家級
    全民數(shù)字素養(yǎng)與技能培訓(xùn)基地
  • 河南省
    第一批產(chǎn)教融合型企業(yè)建設(shè)培育單位
  • 鄭州市
    數(shù)字技能人才(碼農(nóng))培養(yǎng)評價聯(lián)盟
當(dāng)前位置:
首頁新聞資訊IT資訊正文

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

  • 發(fā)布時間:
    2023-05-31
  • 版權(quán)所有:
    云和教育
  • 分享:

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

1.偏向鎖(Biased Locking)

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

2.輕量級鎖(Lightweight Locking)

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

3.重量級鎖(Heavyweight Locking)

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

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

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

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

主站蜘蛛池模板: 庆安县| 罗江县| 体育| 阿瓦提县| 兴和县| 佛山市| 芷江| 临猗县| 台山市| 枝江市| 宁强县| 云龙县| 呼图壁县| 内江市| 鄂托克旗| 当涂县| 灵武市| 汝阳县| 兰坪| 鄢陵县| 璧山县| 华宁县| 玉树县| 阜宁县| 壤塘县| 南川市| 白山市| 永和县| 和林格尔县| 丹巴县| 河池市| 吕梁市| 尼木县| 清水河县| 阜康市| 九江县| 吉隆县| 加查县| 安泽县| 涟水县| 公安县|