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

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

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

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

  是利用鎖的機(jī)制來(lái)實(shí)現(xiàn)同步的,鎖機(jī)制有如下兩種特性:

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

    可見性:必須確保在鎖被釋放之前,對(duì)共享變量所做的修改,對(duì)于隨后獲得該鎖的另一個(gè)線程是可見的(即在獲得鎖時(shí)應(yīng)獲得最新共享變量的值),否則另一個(gè)線程可能是在本地緩存的某個(gè)副本上繼續(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)方法的測(cè)試
    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)方法的測(cè)試
    for(int i=0;i<5;i++){
      new Thread(SynchronizeDemo01::accessResources0).start();
    }

  }

}

  2.同步代碼塊

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

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

  /**
   * synchronized代碼塊(對(duì)象),this指的是當(dāng)前對(duì)象
   * @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)方法的測(cè)試
    SynchronizeDemo01 demo01 = new SynchronizeDemo01();
    for (int i = 0; i < 5; i++) {
      new Thread(demo01::accessResources2).start();
    }

  }

}

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

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

  /**
   * synchronized代碼塊(類.class)
   * @Description: TODO
   * @returnType: void
   */
  public void accessResources3(){
    synchronized(SynchronizeDemo01.class){
      //有Class對(duì)象的所有的對(duì)象都共同使用這一個(gè)鎖
      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)方法的測(cè)試
    SynchronizeDemo01 demo01 = new SynchronizeDemo01();
    for (int i = 0; i < 5; i++) {
      new Thread(demo01::accessResources3).start();
    }

  }

}

Java對(duì)象的monitor對(duì)象的作用?

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

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

Synchronized代碼塊的加鎖機(jī)制?

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

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

 Java虛擬機(jī)中幾種鎖的對(duì)比?

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

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

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

  重量級(jí)鎖:強(qiáng)互斥,鎖標(biāo)志位為10,等待時(shí)間長(zhǎng)

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

相關(guān)文章

  • java swing實(shí)現(xiàn)簡(jiǎn)單計(jì)算器界面

    java swing實(shí)現(xiàn)簡(jiǎn)單計(jì)算器界面

    這篇文章主要為大家詳細(xì)介紹了java swing實(shí)現(xiàn)簡(jiǎn)單計(jì)算器界面,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-04-04
  • Java線程隊(duì)列LinkedBlockingQueue的使用

    Java線程隊(duì)列LinkedBlockingQueue的使用

    本文主要介紹了Java線程隊(duì)列LinkedBlockingQueue的使用,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2023-06-06
  • JDK8環(huán)境中使用struts2的步驟詳解

    JDK8環(huán)境中使用struts2的步驟詳解

    這篇文章主要給大家介紹了關(guān)于在JDK8環(huán)境中使用struts2的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2018-11-11
  • Java中常見的陷阱題及答案

    Java中常見的陷阱題及答案

    在電腦里找到一份當(dāng)時(shí)學(xué)習(xí)JAVA時(shí)的筆記,看到一些現(xiàn)在已經(jīng)遺忘的細(xì)節(jié)。稍微整理了幾個(gè),發(fā)出來(lái)與大家分享。這篇文章主要介紹了Java中常見的陷阱題及答案,需要的朋友可以參考借鑒,下面來(lái)一起看看吧。
    2017-01-01
  • java中實(shí)現(xiàn)map與對(duì)象相互轉(zhuǎn)換的幾種實(shí)現(xiàn)

    java中實(shí)現(xiàn)map與對(duì)象相互轉(zhuǎn)換的幾種實(shí)現(xiàn)

    這篇文章主要介紹了java中實(shí)現(xiàn)map與對(duì)象相互轉(zhuǎn)換的幾種實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2020-07-07
  • 2020年IntelliJ IDEA最新最詳細(xì)配置圖文教程詳解

    2020年IntelliJ IDEA最新最詳細(xì)配置圖文教程詳解

    這篇文章主要介紹了2020年IntelliJ IDEA最新最詳細(xì)配置圖文教程詳解,本文通過(guò)圖文并茂的形式給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2021-02-02
  • 使用Java實(shí)現(xiàn)PDF文字識(shí)別的方法詳解

    使用Java實(shí)現(xiàn)PDF文字識(shí)別的方法詳解

    在現(xiàn)代信息化的社會(huì)中,PDF文件已經(jīng)成為一種非常常見的文檔格式,本文將詳細(xì)介紹如何使用Java實(shí)現(xiàn)PDF文字識(shí)別,包括所需的工具、庫(kù)、代碼實(shí)現(xiàn)以及實(shí)際應(yīng)用中的注意事項(xiàng),需要的朋友可以參考下
    2025-02-02
  • Java面向?qū)ο蠡A(chǔ)教學(xué)(三)

    Java面向?qū)ο蠡A(chǔ)教學(xué)(三)

    這篇文章主要介紹了Java的面相對(duì)象編程思想,包括類對(duì)象方法和封裝繼承多態(tài)等各個(gè)方面的OOP基本要素,非常推薦,需要的朋友可以參考下,希望可以對(duì)你有所幫助
    2021-07-07
  • 圖文詳解Java線程和線程池

    圖文詳解Java線程和線程池

    下面小編就為大家?guī)?lái)一篇詳談Java的線程和線程池。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2021-11-11
  • springmvc之獲取參數(shù)的方法(必看)

    springmvc之獲取參數(shù)的方法(必看)

    下面小編就為大家?guī)?lái)一篇springmvc之獲取參數(shù)的方法(必看)。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2017-08-08

最新評(píng)論

无锡市| 德化县| 丰镇市| 博罗县| 仪陇县| 合江县| 剑川县| 宁明县| 枣阳市| 新密市| 化德县| 乌苏市| 济源市| 平阳县| 游戏| 公安县| 大庆市| 太白县| 精河县| 萍乡市| 沙湾县| 铁力市| 云安县| 隆德县| 永定县| 云阳县| 阿尔山市| 托克托县| 溆浦县| 贡嘎县| 女性| 绥化市| 邵阳市| 吴旗县| 香格里拉县| 万盛区| 弥渡县| 师宗县| 石棉县| 紫金县| 乐昌市|