亚洲激情专区-91九色丨porny丨老师-久久久久久久女国产乱让韩-国产精品午夜小视频观看

溫馨提示×

溫馨提示×

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

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

如何理解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

枞阳县| 论坛| 宝鸡市| 墨玉县| 遵义市| 龙海市| 黄大仙区| 汉阴县| 永嘉县| 昌都县| 兴国县| 犍为县| 太原市| 垦利县| 始兴县| 沙田区| 北宁市| 鹤壁市| 广东省| 江门市| 蓝山县| 高要市| 蓬安县| 枣阳市| 织金县| 双牌县| 淮滨县| 五大连池市| 左贡县| 宁津县| 股票| 岑溪市| 手游| 济宁市| 永顺县| 东丽区| 肥城市| 通渭县| 榆社县| 罗山县| 博白县|