真实的国产乱ⅩXXX66竹夫人,五月香六月婷婷激情综合,亚洲日本VA一区二区三区,亚洲精品一区二区三区麻豆

成都創(chuàng)新互聯(lián)網(wǎng)站制作重慶分公司

如何理解java中鎖與并發(fā)

本篇文章為大家展示了如何理解java中鎖與并發(fā),內(nèi)容簡(jiǎn)明扼要并且容易理解,絕對(duì)能使你眼前一亮,通過(guò)這篇文章的詳細(xì)介紹希望你能有所收獲。

創(chuàng)新互聯(lián)公司服務(wù)項(xiàng)目包括婁底網(wǎng)站建設(shè)、婁底網(wǎng)站制作、婁底網(wǎng)頁(yè)制作以及婁底網(wǎng)絡(luò)營(yíng)銷(xiāo)策劃等。多年來(lái),我們專(zhuān)注于互聯(lián)網(wǎng)行業(yè),利用自身積累的技術(shù)優(yōu)勢(shì)、行業(yè)經(jīng)驗(yàn)、深度合作伙伴關(guān)系等,向廣大中小型企業(yè)、政府機(jī)構(gòu)等提供互聯(lián)網(wǎng)行業(yè)的解決方案,婁底網(wǎng)站推廣取得了明顯的社會(huì)效益與經(jīng)濟(jì)效益。目前,我們服務(wù)的客戶(hù)以成都為中心已經(jīng)輻射到婁底省份的部分城市,未來(lái)相信會(huì)繼續(xù)擴(kuò)大服務(wù)區(qū)域并繼續(xù)獲得客戶(hù)的支持與信任!

1. 對(duì)象頭和鎖

1.1 對(duì)象頭的概念

在java虛擬機(jī)的實(shí)現(xiàn)中,每個(gè)對(duì)象都有一個(gè)對(duì)象頭,用于保存對(duì)象的系統(tǒng)信息。對(duì)象頭中有一個(gè)稱(chēng)為Mark Word的部分,它是實(shí)現(xiàn)鎖的關(guān)鍵。在32位系統(tǒng)中,Mark Word 為一個(gè)32位的數(shù)據(jù),在64位系統(tǒng)中,它占64位。它是一個(gè)多功能的數(shù)據(jù)區(qū),可以存放對(duì)象的哈希值、對(duì)象年齡、鎖的指針等信息。一個(gè)對(duì)象是否占用鎖、占用哪個(gè)鎖,就記錄在這個(gè)Mark Word中。

以32位系統(tǒng)為例,普通對(duì)象的對(duì)象頭如下:

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

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

1.2 偏向鎖的對(duì)象頭

偏向鎖是jdk 1.6提出的一種鎖優(yōu)化方式。其核心思想是,如果程序沒(méi)有競(jìng)爭(zhēng),則取消之前已經(jīng)取得鎖的線程同步操作。也就是說(shuō),某一鎖被線程獲取后,就會(huì)進(jìn)入俯身模式,當(dāng)線程再次請(qǐng)求這個(gè)鎖時(shí),無(wú)須再進(jìn)行相關(guān)的同步操作,從而節(jié)省了操作時(shí)間。如果在此期間有其他線程進(jìn)行了鎖請(qǐng)求,則鎖退出偏向模式。在jvm中,使用-XX:+UseBiasedLocking可以設(shè)置啟用偏向鎖。

對(duì)于偏向鎖的對(duì)象,它的格式如下:

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

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

偏向鎖示例:

package jvm.chapter08;

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

/**
 * 使用一個(gè)線程對(duì)Vector進(jìn)行寫(xiě)入操作,由于對(duì)Vector的訪問(wèn)內(nèi)部都用同步鎖控制,
 * 每次add()操作都會(huì)請(qǐng)求numberList對(duì)象的鎖。
 *
 * @author chengyan
 * @date 2019-11-17 7:41 下午
 */
public class Demo01 {
    public static List numberList = new Vector();

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

使用參數(shù)-XX:+UseBiasedLocking -XX:BiasedLockingStartupDelay=0 -client -Xmx512m -Xms512m運(yùn)行,結(jié)果如下:

227

這說(shuō)明程序用227毫秒完成所有的工作。參數(shù)-XX:BiasedLockingStartupDelay表示虛擬機(jī)在啟動(dòng)后立即使用偏向鎖。如不設(shè)置該參數(shù),虛擬機(jī)默認(rèn)會(huì)在啟動(dòng)后4秒后,才啟用偏向鎖,考慮到程序運(yùn)行時(shí)間較短,故做此設(shè)置,盡早啟用偏向鎖。

若禁用偏向鎖,則只需使用如下參數(shù)啟動(dòng)程序:

-XX:-UseBiasedLocking -client -Xmx512m -Xms512m

結(jié)果如下:

363
1.3 輕量級(jí)鎖的對(duì)象頭

當(dāng)對(duì)象處于輕量級(jí)鎖時(shí),其中Mark Word 如下(00表示最后2位的值):

[ptr | 00] locked

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

1.4 重量級(jí)鎖的對(duì)象頭

當(dāng)對(duì)象處于輕量級(jí)鎖時(shí),其中Mark Word 如下:

[ptr | 10] monitor

此時(shí),最后2位為10,整個(gè) Mark Word 指向 Minitor的指針。

1.5 普通對(duì)象的對(duì)象頭

當(dāng)對(duì)象處理于普通的未鎖定狀態(tài)時(shí),其格式如下:

[header | 0 | 01|] unlocked

前29位表示對(duì)象的哈希值、年齡等信息。倒數(shù)第3位為0,最后兩位為01,表示未鎖定??梢园l(fā)現(xiàn),最后兩位的值和偏向狀態(tài)是一樣的,此時(shí)虛擬機(jī)通過(guò)倒數(shù)第3位來(lái)區(qū)分是否為偏向鎖。

上述內(nèi)容就是如何理解java中鎖與并發(fā),你們學(xué)到知識(shí)或技能了嗎?如果還想學(xué)到更多技能或者豐富自己的知識(shí)儲(chǔ)備,歡迎關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道。


本文標(biāo)題:如何理解java中鎖與并發(fā)
標(biāo)題URL:http://weahome.cn/article/jphgjp.html

其他資訊

在線咨詢(xún)

微信咨詢(xún)

電話咨詢(xún)

028-86922220(工作日)

18980820575(7×24)

提交需求

返回頂部