最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Java中的關(guān)鍵字synchronized 詳解

 更新時(shí)間:2019年03月19日 10:54:21   作者:陽(yáng)光、大地和詩(shī)歌  
這篇文章主要介紹了Java中的關(guān)鍵字synchronized,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧

在并發(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性能。這種情況下,引入了偏向鎖概念。

  1. 訪問(wèn)同步代碼塊
  2. 判斷對(duì)象頭Mark Word中存儲(chǔ)的線程ID是否指向當(dāng)前線程,如果是,則表明當(dāng)前是鎖的重入,不需要再獲得鎖,直接執(zhí)行同步代碼
  3. 如果不是,則嘗試使用CAS算法將線程ID更新至對(duì)象頭中。
  4. 成功,獲得鎖,執(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、輕量鎖

訪問(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)的。

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

以上所述是小編給大家介紹的Java中的關(guān)鍵字synchronized詳解整合,希望對(duì)大家有所幫助,如果大家有任何疑問(wèn)請(qǐng)給我留言,小編會(huì)及時(shí)回復(fù)大家的。在此也非常感謝大家對(duì)腳本之家網(wǎng)站的支持!

 

相關(guān)文章

  • SpringBoot整合Java Web三大件的詳細(xì)過(guò)程

    SpringBoot整合Java Web三大件的詳細(xì)過(guò)程

    這篇文章主要介紹了SpringBoot整合Java Web三大件的詳細(xì)過(guò)程,注冊(cè)自定義的Servlet、Filter、Listener組件到springboot內(nèi)嵌的Servlet容器,讓它們發(fā)揮自己的作用,需要的朋友可以參考下
    2025-04-04
  • Spring?boot整合ELK詳細(xì)過(guò)程

    Spring?boot整合ELK詳細(xì)過(guò)程

    ELK是由Elasticsearch、Logstash和Kibana三個(gè)開(kāi)源軟件組成的技術(shù)堆棧,主要用于數(shù)據(jù)的存儲(chǔ)、處理和可視化,本文給大家介紹Spring?boot整合ELK詳細(xì)過(guò)程,感興趣的朋友一起看看吧
    2024-01-01
  • 基于SpringBoot+Redis的Session共享與單點(diǎn)登錄詳解

    基于SpringBoot+Redis的Session共享與單點(diǎn)登錄詳解

    這篇文章主要介紹了基于SpringBoot+Redis的Session共享與單點(diǎn)登錄,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2019-07-07
  • Java?超詳細(xì)講解字符流

    Java?超詳細(xì)講解字符流

    字符流就是在字節(jié)流的基礎(chǔ)上,加上編碼,形成的數(shù)據(jù)流,字符流出現(xiàn)的意義是因?yàn)樽止?jié)流在操作字符時(shí),可能會(huì)有中文導(dǎo)致的亂碼,所以由字節(jié)流引申出了字符流
    2022-04-04
  • springboot2.0如何通過(guò)fastdfs實(shí)現(xiàn)文件分布式上傳

    springboot2.0如何通過(guò)fastdfs實(shí)現(xiàn)文件分布式上傳

    這篇文章主要介紹了springboot2.0如何通過(guò)fastdfs實(shí)現(xiàn)文件分布式上傳,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2019-12-12
  • SpringBoot使用WebSocket的方法實(shí)例詳解

    SpringBoot使用WebSocket的方法實(shí)例詳解

    WebSocket 是 HTML5 開(kāi)始提供的一種在單個(gè) TCP 連接上進(jìn)行全雙工通訊的協(xié)議。這篇文章主要介紹了SpringBoot使用WebSocket,需要的朋友可以參考下
    2019-06-06
  • 關(guān)于java String中intern的深入講解

    關(guān)于java String中intern的深入講解

    這篇文章主要給大家介紹了關(guān)于java String中intern的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家學(xué)習(xí)或者使用java具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2019-04-04
  • Maven scala和java混合打包方式

    Maven scala和java混合打包方式

    這篇文章主要介紹了Maven scala和java混合打包方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-06-06
  • Java Spring @Lazy延遲注入源碼案例詳解

    Java Spring @Lazy延遲注入源碼案例詳解

    這篇文章主要介紹了Java Spring @Lazy延遲注入源碼案例詳解,本篇文章通過(guò)簡(jiǎn)要的案例,講解了該項(xiàng)技術(shù)的了解與使用,以下就是詳細(xì)內(nèi)容,需要的朋友可以參考下
    2021-09-09
  • Java中堆和棧的概念和區(qū)別

    Java中堆和棧的概念和區(qū)別

    Java的堆是一個(gè)運(yùn)行時(shí)數(shù)據(jù)區(qū),類的對(duì)象從堆中分配空間。棧中主要存放一些基本數(shù)據(jù)類型的變量(byte,short,int,long,float,double,boolean,char)和對(duì)象的引用,這篇文章給大家詳細(xì)介紹java 堆和棧的概念和區(qū)別,一起看看吧
    2020-06-06

最新評(píng)論

三明市| 山西省| 宜宾县| 宁国市| 黎平县| 沛县| 桃园县| 怀宁县| 阿坝县| 玛多县| 长葛市| 阳谷县| 大埔区| 枣强县| 黄梅县| 稷山县| 和平区| 元氏县| 玛沁县| 安宁市| 恩平市| 垫江县| 井陉县| 白银市| 淮北市| 化德县| 湟中县| 普洱| 垫江县| 万载县| 新民市| 天峻县| 石门县| 山西省| 贵定县| 松江区| 定西市| 通道| 安龙县| 含山县| 额济纳旗|