欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

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

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

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

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

1、修飾普通方法

 private synchronized void synMethod(){
  
 }

 

這種用法中,synchronized鎖的對象實例。

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

private static synchronized void synMethod(){
  
 }

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

3、同步方法塊

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

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

再介紹鎖原理

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

鎖狀態(tài)

25 bit

4bit

1bit

2bit

 

23bit

2bit

是否偏向鎖

鎖標(biāo)志位

輕量級鎖

指向棧中鎖記錄的指針

0

重量級鎖

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

10

GC標(biāo)記

11

偏向鎖

線程ID

Epoch

對象分代年齡

1

01

無鎖

對象的hashCode

對象分代年齡

0

01

上面的表格中,描述的是對象在每個鎖狀態(tài)時,對象頭中所存儲的信息。

1、偏向鎖

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

  1. 訪問同步代碼塊
  2. 判斷對象頭Mark Word中存儲的線程ID是否指向當(dāng)前線程,如果是,則表明當(dāng)前是鎖的重入,不需要再獲得鎖,直接執(zhí)行同步代碼
  3. 如果不是,則嘗試使用CAS算法將線程ID更新至對象頭中。
  4. 成功,獲得鎖,執(zhí)行同步代碼。更新失敗表明存在鎖競爭,等待全局安全點,暫停擁有偏向鎖的線程,根據(jù)對象頭的鎖標(biāo)志位,選擇將偏向鎖升級為輕量鎖或者置為無鎖。

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

2、輕量鎖

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

把對象頭Mark Word拷貝到Lock Record中。

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

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

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

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

如果不是,則說明此時存在競爭。需要把輕量鎖膨脹為重量鎖。

3、重量鎖

重量鎖是基于對象監(jiān)視器(Monitor)來實現(xiàn)的。

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

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

 

相關(guān)文章

  • 淺析Java如何在并發(fā)環(huán)境下生成一個只讀的map

    淺析Java如何在并發(fā)環(huán)境下生成一個只讀的map

    這篇文章主要為大家詳細(xì)介紹了Java如何在并發(fā)環(huán)境下生成一個只讀的map,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下
    2024-04-04
  • 一文詳解spring注解配置bean的初始化方法和銷毀方法

    一文詳解spring注解配置bean的初始化方法和銷毀方法

    本篇我們講解下spring項目中如何為bean指定初始化方法和銷毀方法。當(dāng)spring完成bean的屬性賦值之后,就會執(zhí)行bean的初始化方法,而當(dāng)spring要銷毀bean實例的時候,也會調(diào)用bean的銷毀方法。文中有詳細(xì)的代碼實例,需要的朋友可以參考下
    2023-05-05
  • gradle使用maven-publish發(fā)布jar包上傳到私有maven配置

    gradle使用maven-publish發(fā)布jar包上傳到私有maven配置

    這篇文章主要介紹了gradle使用maven-publish發(fā)布jar包上傳到私有maven的配置示例,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-03-03
  • springboot打war包的全過程記錄

    springboot打war包的全過程記錄

    其實一般使用springboot使用打成jar包比較省事的,但也有很多童鞋是習(xí)慣使用war包的,下面這篇文章主要給大家介紹了關(guān)于springboot打war包的相關(guān)資料,需要的朋友可以參考下
    2022-06-06
  • ZooKeeper入門教程三分布式鎖實現(xiàn)及完整運行源碼

    ZooKeeper入門教程三分布式鎖實現(xiàn)及完整運行源碼

    本文是ZooKeeper入門系列教程,分布式鎖有多種實現(xiàn)方式,比如通過數(shù)據(jù)庫、redis都可實現(xiàn)。作為分布式協(xié)同工具ZooKeeper,當(dāng)然也有著標(biāo)準(zhǔn)的實現(xiàn)方式。本文介紹在zookeeper中如何實現(xiàn)排他鎖
    2022-01-01
  • 詳解Java的Struts框架以及相關(guān)的MVC設(shè)計理念

    詳解Java的Struts框架以及相關(guān)的MVC設(shè)計理念

    這篇文章主要介紹了詳解Java的Struts框架以及相關(guān)的MVC設(shè)計理念,Struts是Java的SSH三大web開發(fā)框架之一,需要的朋友可以參考下
    2015-12-12
  • Java數(shù)組(Array)最全匯總(下篇)

    Java數(shù)組(Array)最全匯總(下篇)

    這篇文章主要介紹了Java數(shù)組(Array)最全匯總(下篇),本文章內(nèi)容詳細(xì),通過案例可以更好的理解數(shù)組的相關(guān)知識,本模塊分為了三部分,本次為下篇,需要的朋友可以參考下
    2023-01-01
  • 關(guān)于springboot2整合lettuce啟動卡住問題的解決方法

    關(guān)于springboot2整合lettuce啟動卡住問題的解決方法

    Lettuce和Jedis的都是連接Redis Server的客戶端程序,下面這篇文章主要給大家介紹了關(guān)于springboot2整合lettuce啟動卡住問題的解決方法,文中通過示例代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2021-12-12
  • Spring的異常處理@ExceptionHandler注解解析

    Spring的異常處理@ExceptionHandler注解解析

    這篇文章主要介紹了Spring的異常處理@ExceptionHandler注解解析,當(dāng)一個Controller中有方法加了@ExceptionHandler之后,這個Controller其他方法中沒有捕獲的異常就會以參數(shù)的形式傳入加了@ExceptionHandler注解的那個方法中,需要的朋友可以參考下
    2023-12-12
  • java對象數(shù)組實現(xiàn)學(xué)生信息管理系統(tǒng)

    java對象數(shù)組實現(xiàn)學(xué)生信息管理系統(tǒng)

    這篇文章主要為大家詳細(xì)介紹了java對象數(shù)組實現(xiàn)學(xué)生信息管理系統(tǒng),文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2021-06-06

最新評論