成人午夜视频全免费观看高清-秋霞福利视频一区二区三区-国产精品久久久久电影小说-亚洲不卡区三一区三区一区

Java中synchronized關(guān)鍵字的使用方法

這篇文章將為大家詳細(xì)講解有關(guān)Java中synchronized關(guān)鍵字的使用方法,小編覺(jué)得挺實(shí)用的,因此分享給大家做個(gè)參考,希望大家閱讀完這篇文章后可以有所收獲。

成都創(chuàng)新互聯(lián)公司-專業(yè)網(wǎng)站定制、快速模板網(wǎng)站建設(shè)、高性價(jià)比向陽(yáng)網(wǎng)站開發(fā)、企業(yè)建站全套包干低至880元,成熟完善的模板庫(kù),直接使用。一站式向陽(yáng)網(wǎng)站制作公司更省心,省錢,快速模板網(wǎng)站建設(shè)找我們,業(yè)務(wù)覆蓋向陽(yáng)地區(qū)。費(fèi)用合理售后完善,10多年實(shí)體公司更值得信賴。

                                                           

在并發(fā)編程中,synchronized關(guān)鍵字是常出現(xiàn)的角色。之前我們都稱呼synchronized關(guān)鍵字為重量鎖,但是在JDK1.6中對(duì)synchronized進(jìn)行了優(yōu)化,引入了偏向鎖、輕量鎖。本篇介紹synchronized關(guān)鍵字的使用方式,區(qū)別和偏向鎖、輕量鎖和重量鎖實(shí)現(xiàn)原理。

先看看synchronized關(guān)鍵字的4種用法。

1、修飾普通方法

private synchronized void synMethod(){
}

這種用法中,synchronized鎖的對(duì)象實(shí)例。

2、修飾靜態(tài)方法

private static synchronized void synMethod(){
}

synchronized在這種情況下,鎖的是當(dāng)前Class類對(duì)象。

3、同步方法塊

private  void synMethod1(){
        synchronized(this){
            
        }
    }    
    private  void synMethod2(){
        synchronized(ThreadTest.class){
            
        }
    }

synMethod1中鎖對(duì)象實(shí)例;synMethod2的是當(dāng)前Class類對(duì)象。

再介紹鎖原理

在介紹鎖原理之前,先認(rèn)識(shí)一下Java對(duì)象頭Mark Word,以32位為例。

鎖狀態(tài)

25 bit

4bit

1bit

2bit

23bit

2bit

是否偏向鎖

鎖標(biāo)志位

輕量級(jí)鎖

指向棧中鎖記錄的指針

0

重量級(jí)鎖

指向互斥量(重量級(jí)鎖)的指針

10

GC標(biāo)記

11

偏向鎖

線程ID

Epoch

對(duì)象分代年齡

1

01

無(wú)鎖

對(duì)象的hashCode

對(duì)象分代年齡

0

01

上面的表格中,描述的是對(duì)象在每個(gè)鎖狀態(tài)時(shí),對(duì)象頭中所存儲(chǔ)的信息。

1、偏向鎖

實(shí)際環(huán)境中,線程在訪問(wèn)同步塊時(shí),如果沒(méi)有其他線程對(duì)鎖進(jìn)行競(jìng)爭(zhēng),并且由同一個(gè)線程多次獲得鎖,也就是單線程運(yùn)行同步代碼,在這種情況下,若是每次還阻塞線程,就代表白白浪費(fèi)CPU性能。這種情況下,引入了偏向鎖概念。

Java中synchronized關(guān)鍵字的使用方法

  • 訪問(wèn)同步代碼塊

  • 判斷對(duì)象頭Mark Word中存儲(chǔ)的線程ID是否指向當(dāng)前線程,如果是,則表明當(dāng)前是鎖的重入,不需要再獲得鎖,直接執(zhí)行同步代碼

  • 如果不是,則嘗試使用CAS算法將線程ID更新至對(duì)象頭中。

  • 成功,獲得鎖,執(zhí)行同步代碼。更新失敗表明存在鎖競(jìng)爭(zhēng),等待全局安全點(diǎn),暫停擁有偏向鎖的線程,根據(jù)對(duì)象頭的鎖標(biāo)志位,選擇將偏向鎖升級(jí)為輕量鎖或者置為無(wú)鎖。

 可以使用-XX:-userBiasedLocking=false來(lái)關(guān)閉JVM偏向鎖優(yōu)化,默認(rèn)直接進(jìn)入輕量鎖。

2、輕量鎖

Java中synchronized關(guān)鍵字的使用方法

  • 訪問(wèn)同步代碼塊時(shí),先在當(dāng)前線程的線程棧中創(chuàng)建一個(gè)鎖記錄(Lock Record)區(qū)域。

  • 把對(duì)象頭Mark Word拷貝到Lock Record中。

  • 利用CAS嘗試將對(duì)象頭Mark Word中的線程指針更新為指向當(dāng)前線程的指針

  • 更新成功,則獲得輕量鎖。

  • 更新失敗,檢查Mark Word中的指針是否指向當(dāng)前線程。

  • 如果是,則說(shuō)明是鎖的重入現(xiàn)象。執(zhí)行同步代碼塊

  • 如果不是,則說(shuō)明此時(shí)存在競(jìng)爭(zhēng)。需要把輕量鎖膨脹為重量鎖。

3、重量鎖

重量鎖是基于對(duì)象監(jiān)視器(Monitor)來(lái)實(shí)現(xiàn)的。

Java中synchronized關(guān)鍵字的使用方法

線程在執(zhí)行同步代碼時(shí),需要調(diào)用一個(gè)Monitor.enter指令。執(zhí)行退出后,調(diào)用Monitor.exit指令。這里看得出,監(jiān)視器具有排它性,一個(gè)時(shí)間點(diǎn)只能有一個(gè)線程enter成功,其他線程只能阻塞在隊(duì)列中。所以這種重量鎖的操作成本很高。

關(guān)于Java中synchronized關(guān)鍵字的使用方法就分享到這里了,希望以上內(nèi)容可以對(duì)大家有一定的幫助,可以學(xué)到更多知識(shí)。如果覺(jué)得文章不錯(cuò),可以把它分享出去讓更多的人看到。

網(wǎng)站題目:Java中synchronized關(guān)鍵字的使用方法
本文鏈接:http://jinyejixie.com/article18/psppdp.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供、微信小程序、建站公司、網(wǎng)站排名標(biāo)簽優(yōu)化、品牌網(wǎng)站設(shè)計(jì)

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)

成都定制網(wǎng)站網(wǎng)頁(yè)設(shè)計(jì)