中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

如何理解java中鎖與并發

發布時間:2021-09-27 09:52:13 來源:億速云 閱讀:120 作者:柒染 欄目:編程語言

本篇文章為大家展示了如何理解java中鎖與并發,內容簡明扼要并且容易理解,絕對能使你眼前一亮,通過這篇文章的詳細介紹希望你能有所收獲。

1. 對象頭和鎖

1.1 對象頭的概念

在java虛擬機的實現中,每個對象都有一個對象頭,用于保存對象的系統信息。對象頭中有一個稱為Mark Word的部分,它是實現鎖的關鍵。在32位系統中,Mark Word 為一個32位的數據,在64位系統中,它占64位。它是一個多功能的數據區,可以存放對象的哈希值、對象年齡、鎖的指針等信息。一個對象是否占用鎖、占用哪個鎖,就記錄在這個Mark Word中。

以32位系統為例,普通對象的對象頭如下:

hash: 25 --------->| age: 4    biased_lock: 1    lock: 2

它表示Mark Word 中有25位表示對象的哈希值,4位表示對象的年齡,1位表示是否為偏向鎖,2位表示鎖的信息。

1.2 偏向鎖的對象頭

偏向鎖是jdk 1.6提出的一種鎖優化方式。其核心思想是,如果程序沒有競爭,則取消之前已經取得鎖的線程同步操作。也就是說,某一鎖被線程獲取后,就會進入俯身模式,當線程再次請求這個鎖時,無須再進行相關的同步操作,從而節省了操作時間。如果在此期間有其他線程進行了鎖請求,則鎖退出偏向模式。在jvm中,使用-XX:+UseBiasedLocking可以設置啟用偏向鎖。

對于偏向鎖的對象,它的格式如下:

[JavaThread*  | epoch | age | 1 | 01]

前23位表示持有偏向鎖的線程,后續2位表示偏向鎖的時間戳(epoch),4位表示對象年齡,年齡后固定為1,表示偏向鎖,最近2位為01,表示可偏向/未鎖定。

偏向鎖示例:

package jvm.chapter08;

import java.util.List;
import java.util.Vector;

/**
 * 使用一個線程對Vector進行寫入操作,由于對Vector的訪問內部都用同步鎖控制,
 * 每次add()操作都會請求numberList對象的鎖。
 *
 * @author chengyan
 * @date 2019-11-17 7:41 下午
 */
public class Demo01 {
    public static List<Integer> numberList = new Vector<Integer>();

    public static void main(String[] args) throws InterruptedException {
        long begin = System.currentTimeMillis();
        int count = 0;
        int startnum = 0;
        while(count < 1000_0000) {
            numberList.add(startnum);
            startnum += 2;
            count++;
        }
        long end = System.currentTimeMillis();
        System.out.println(end - begin);
    }
}

使用參數-XX:+UseBiasedLocking -XX:BiasedLockingStartupDelay=0 -client -Xmx512m -Xms512m運行,結果如下:

227

這說明程序用227毫秒完成所有的工作。參數-XX:BiasedLockingStartupDelay表示虛擬機在啟動后立即使用偏向鎖。如不設置該參數,虛擬機默認會在啟動后4秒后,才啟用偏向鎖,考慮到程序運行時間較短,故做此設置,盡早啟用偏向鎖。

若禁用偏向鎖,則只需使用如下參數啟動程序:

-XX:-UseBiasedLocking -client -Xmx512m -Xms512m

結果如下:

363
1.3 輕量級鎖的對象頭

當對象處于輕量級鎖時,其中Mark Word 如下(00表示最后2位的值):

[ptr | 00] locked

此時,它指向存放在獲得鎖的線程棧中的該對象的真實對象頭。

1.4 重量級鎖的對象頭

當對象處于輕量級鎖時,其中Mark Word 如下:

[ptr | 10] monitor

此時,最后2位為10,整個 Mark Word 指向 Minitor的指針。

1.5 普通對象的對象頭

當對象處理于普通的未鎖定狀態時,其格式如下:

[header | 0 | 01|] unlocked

前29位表示對象的哈希值、年齡等信息。倒數第3位為0,最后兩位為01,表示未鎖定。可以發現,最后兩位的值和偏向狀態是一樣的,此時虛擬機通過倒數第3位來區分是否為偏向鎖。

上述內容就是如何理解java中鎖與并發,你們學到知識或技能了嗎?如果還想學到更多技能或者豐富自己的知識儲備,歡迎關注億速云行業資訊頻道。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

新竹县| 将乐县| 乌鲁木齐县| 当雄县| 太白县| 谷城县| 上犹县| 马边| 雅江县| 定安县| 秦安县| 电白县| 繁昌县| 施甸县| 连城县| 正阳县| 揭西县| 荃湾区| 彰武县| 无为县| 来凤县| 南宁市| 阿瓦提县| 专栏| 平定县| 仙居县| 泽州县| 平凉市| 宝兴县| 安图县| 白沙| 大埔区| 大足县| 宜春市| 云林县| 醴陵市| 密云县| 丁青县| 右玉县| 凤山市| 交城县|