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

深入分析JAVA Synchronized關(guān)鍵字

 更新時間:2020年06月19日 11:41:00   作者:WK_BlogYard  
這篇文章主要介紹了析JAVA Synchronized關(guān)鍵字的相關(guān)知識,文中代碼非常詳細(xì),幫助大家更好的理解和學(xué)習(xí),感興趣的朋友可以了解下

并發(fā)一致性的概念?

  是利用鎖的機制來實現(xiàn)同步的,鎖機制有如下兩種特性:

    互斥性:即在同一時間只允許一個線程持有某個對象鎖,通過這種特性來實現(xiàn)多線程中的協(xié)調(diào)機制,這樣在同一時間只有一個線程對需同步的代碼塊(復(fù)合操作)進(jìn)行訪問?;コ庑晕覀円餐Q為操作的原子性。

    可見性:必須確保在鎖被釋放之前,對共享變量所做的修改,對于隨后獲得該鎖的另一個線程是可見的(即在獲得鎖時應(yīng)獲得最新共享變量的值),否則另一個線程可能是在本地緩存的某個副本上繼續(xù)操作從而引起不一致。

Synchronized的用法?

  1.同步方法

    同步非靜態(tài)方法

/**
 * Synchronized關(guān)鍵字的用法
 * @author Administrator
 *
 */
public class SynchronizeDemo01 {

  /**
   * 修飾非靜態(tài)方法
   * @Description: TODO
   * @returnType: void
   */
  public synchronized void accessResources1(){
    try {
      TimeUnit.SECONDS.sleep(2);
      System.out.println(Thread.currentThread().getName()+" is running!");
    } catch (InterruptedException e) {
      // TODO Auto-generated catch block
      e.printStackTrace();
    }
  }

  public static void main(String[] args) {

    //非靜態(tài)方法的測試
    SynchronizeDemo01 demo01 = new SynchronizeDemo01();
    for (int i = 0; i < 5; i++) {
      new Thread(demo01::accessResources1).start();
    }

  }

}

     同步靜態(tài)方法

/**
 * Synchronized關(guān)鍵字的用法
 * @author Administrator
 *
 */
public class SynchronizeDemo01 {
  /**
   * 修飾靜態(tài)方法
   * @Description: TODO
   * @returnType: void
   */
  public synchronized static void accessResources0(){
    try {
      TimeUnit.SECONDS.sleep(2);
      System.out.println(Thread.currentThread().getName()+" is running!");
    } catch (InterruptedException e) {
      // TODO Auto-generated catch block
      e.printStackTrace();
    }
  }

  public static void main(String[] args) {
    //靜態(tài)方法的測試
    for(int i=0;i<5;i++){
      new Thread(SynchronizeDemo01::accessResources0).start();
    }

  }

}

  2.同步代碼塊

    代碼塊對象,獲取對象鎖,在 Java 中,每個對象都會有一個 monitor 對象,這個對象其實就是 Java 對象的鎖,通常會被稱為“內(nèi)置鎖”或“對象鎖”。類的對象可以有多個,所以每個對象有其獨立的對象鎖,互不干擾。

/**
 * Synchronized關(guān)鍵字的用法
 * @author Administrator
 *
 */
public class SynchronizeDemo01 {

  /**
   * synchronized代碼塊(對象),this指的是當(dāng)前對象
   * @Description: TODO
   * @returnType: void
   */
  public void accessResources2(){
    synchronized(this){
      try {
        TimeUnit.SECONDS.sleep(2);
        System.out.println(Thread.currentThread().getName()+" is running!");
      } catch (InterruptedException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
      }
    }
  }


  public static void main(String[] args) {
    //非靜態(tài)方法的測試
    SynchronizeDemo01 demo01 = new SynchronizeDemo01();
    for (int i = 0; i < 5; i++) {
      new Thread(demo01::accessResources2).start();
    }

  }

}

    代碼塊 (類.class),獲取類鎖,在 Java 中,針對每個類也有一個鎖,可以稱為“類鎖”,類鎖實際上是通過對象鎖實現(xiàn)的,即類的 Class 對象鎖。每個類只有一個 Class 對象,所以每個類只有一個類鎖。

/**
 * Synchronized關(guān)鍵字的用法
 * @author Administrator
 *
 */
public class SynchronizeDemo01 {

  /**
   * synchronized代碼塊(類.class)
   * @Description: TODO
   * @returnType: void
   */
  public void accessResources3(){
    synchronized(SynchronizeDemo01.class){
      //有Class對象的所有的對象都共同使用這一個鎖
      try {
        TimeUnit.SECONDS.sleep(2);
        System.out.println(Thread.currentThread().getName()+" is running!");
      } catch (InterruptedException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
      }
    }
  }
  public static void main(String[] args) {
    //非靜態(tài)方法的測試
    SynchronizeDemo01 demo01 = new SynchronizeDemo01();
    for (int i = 0; i < 5; i++) {
      new Thread(demo01::accessResources3).start();
    }

  }

}

Java對象的monitor對象的作用?

  1.當(dāng)某一線程想要占有這個對象的時候,首先判斷monitor 的計數(shù)器是不是0,如果是0表示還沒有線程占有,這個時候線程可以占有這個對象,并且對這個對象的monitor+1;如果不為0,表示這個線程已經(jīng)被其他線程占有,那么這個線程需要等待。當(dāng)線程釋放占有權(quán)的時候,monitor-1。

  2. 同一線程可以對同一對象進(jìn)行多次加鎖,+1,+1,重入性

Synchronized代碼塊的加鎖機制?

  1.對代碼塊的加鎖,通過反編譯文件,發(fā)現(xiàn)在Monitorenter和Monitorexit中間是加鎖的部分

  2.對方法的加鎖,通過反編譯文件,發(fā)現(xiàn)標(biāo)有ACC_SYNCHRONIZED標(biāo)識的為加鎖方法

 Java虛擬機中幾種鎖的對比?

  無狀態(tài)鎖:沒有加鎖

  偏向鎖:在對象第一次被某一線程占有的時候,會將“是否偏向鎖”字段置為1,“鎖標(biāo)志位”記為01,寫入線程號,當(dāng)其他的線 程訪問的時候,就會發(fā)生 競爭,如果競爭失敗則升級為輕量級鎖。偏向鎖更加偏向第一次訪問的線程獲取鎖成功。

     輕量級鎖:線程有交替適用,互斥性不是很強,當(dāng)偏向鎖通過CAS算法獲取鎖失敗,把鎖標(biāo)志位置為00。

  重量級鎖:強互斥,鎖標(biāo)志位為10,等待時間長

以上就是深入分析JAVA Synchronized關(guān)鍵字的詳細(xì)內(nèi)容,更多關(guān)于JAVA Synchronized關(guān)鍵字的資料請關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • JAVA?biginteger類bigdecimal類的使用示例學(xué)習(xí)

    JAVA?biginteger類bigdecimal類的使用示例學(xué)習(xí)

    這篇文章主要為大家介紹了JAVA?biginteger類bigdecimal類的使用示例學(xué)習(xí),有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-07-07
  • 關(guān)于Java繼承中父類和子類構(gòu)造函數(shù)的問題

    關(guān)于Java繼承中父類和子類構(gòu)造函數(shù)的問題

    這篇文章主要介紹了關(guān)于Java繼承中父類和子類構(gòu)造函數(shù)的問題,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-10-10
  • springboot網(wǎng)站應(yīng)用使用第三方qq登錄的實現(xiàn)過程

    springboot網(wǎng)站應(yīng)用使用第三方qq登錄的實現(xiàn)過程

    這篇文章主要介紹了springboot網(wǎng)站應(yīng)用使用第三方qq登錄,本文通過實例圖文相結(jié)合給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2021-09-09
  • idea2020最新版配置maven的方法

    idea2020最新版配置maven的方法

    這篇文章主要介紹了idea2020最新版配置maven的方法,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-06-06
  • Spring中的@RefreshScope注解作用

    Spring中的@RefreshScope注解作用

    這篇文章主要介紹了Spring中的@RefreshScope注解作用詳解,@RefreshScope注解是Spring Cloud中的一個重要注解,用于實現(xiàn)動態(tài)刷新配置的功能,當(dāng)我們在應(yīng)用程序中使用@Value注解獲取配置屬性時,如果配置發(fā)生變化,需要重啟應(yīng)用程序才能生效,需要的朋友可以參考下
    2023-10-10
  • 詳解Java的堆內(nèi)存與棧內(nèi)存的存儲機制

    詳解Java的堆內(nèi)存與棧內(nèi)存的存儲機制

    這篇文章主要介紹了Java的堆內(nèi)存與棧內(nèi)存的存儲機制,包括JVM的內(nèi)存優(yōu)化和GC等相關(guān)方面內(nèi)容,需要的朋友可以參考下
    2016-01-01
  • java實現(xiàn)坦克大戰(zhàn)小游戲

    java實現(xiàn)坦克大戰(zhàn)小游戲

    這篇文章主要為大家詳細(xì)介紹了java實現(xiàn)坦克大戰(zhàn)小游戲,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2021-01-01
  • Java日常練習(xí)題,每天進(jìn)步一點點(39)

    Java日常練習(xí)題,每天進(jìn)步一點點(39)

    下面小編就為大家?guī)硪黄狫ava基礎(chǔ)的幾道練習(xí)題(分享)。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧,希望可以幫到你
    2021-07-07
  • Springboot AOP對指定敏感字段數(shù)據(jù)加密存儲的實現(xiàn)

    Springboot AOP對指定敏感字段數(shù)據(jù)加密存儲的實現(xiàn)

    本篇文章主要介紹了利用Springboot+AOP對指定的敏感數(shù)據(jù)進(jìn)行加密存儲以及對數(shù)據(jù)中加密的數(shù)據(jù)的解密的方法,代碼詳細(xì),具有一定的價值,感興趣的小伙伴可以了解一下
    2021-11-11
  • springboot2.3之后hibernate-validator依賴缺失【踩坑】

    springboot2.3之后hibernate-validator依賴缺失【踩坑】

    這篇文章主要介紹了springboot2.3之后hibernate-validator依賴缺失【踩坑】,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-11-11

最新評論