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

java 中同步方法和同步代碼塊的區(qū)別詳解

 更新時間:2017年02月25日 10:17:27   投稿:lqh  
這篇文章主要介紹了java 中同步方法和同步代碼塊的區(qū)別是什么的相關(guān)資料,需要的朋友可以參考下

java 中同步方法和同步代碼塊的區(qū)別詳解

在Java語言中,每一個對象有一把鎖。線程可以使用synchronized關(guān)鍵字來獲取對象上的鎖。synchronized關(guān)鍵字可應(yīng)用在方法級別(粗粒度鎖)或者是代碼塊級別(細(xì)粒度鎖)。

問題的由來:

看到這樣一個面試題:

//下列兩個方法有什么區(qū)別
public synchronized void method1(){}

public void method2(){
 synchronized (obj){}
}

synchronized用于解決同步問題,當(dāng)有多條線程同時訪問共享數(shù)據(jù)時,如果進(jìn)行同步,就會發(fā)生錯誤,Java提供的解決方案是:只要將操作共享數(shù)據(jù)的語句在某一時段讓一個線程執(zhí)行完,在執(zhí)行過程中,其他線程不能進(jìn)來執(zhí)行可以。解決這個問題。這里在用synchronized時會有兩種方式,一種是上面的同步方法,即用synchronized來修飾方法,另一種是提供的同步代碼塊。

這里總感覺怪怪的,這兩種方法有什么區(qū)別呢,基礎(chǔ)學(xué)得不好,于是就動手做了個簡單的測試,代碼如下:

public class SynObj {
  public synchronized void methodA() {
    System.out.println("methodA.....");
    try {
      Thread.sleep(5000);
    } catch (InterruptedException e) {
      e.printStackTrace();
    }
  }

  public void methodB() {
    synchronized(this) {
      System.out.pritntln("methodB.....");
    }
  }

  public void methodC() {
    String str = "sss";
    synchronized (str) {
      System.out.println(    "methodC.....");
    }
  }
}

public class TestSyn {
  public static void main(String[] args) {
    final SynObj obj = new SynObj();

    Thread t1 = new Thread(new Runnable() {
      @Override
      public void run() {
        obj.methodA();
      }
    });
    t1.start();

    Thread t2 = new Thread(new Runnable() {
      @Override
      public void run() {
        obj.methodB();
      }
    });
    t2.start();

    Thread t3 = new Thread(new Runnable() {
      @Override
      public void run() {
        obj.methodC();
      }
    });
    t3.start();
  }
}

這段小代碼片段打印結(jié)果如下:

methodA.....
methodC.....
//methodB會隔一段時間才會打印出來
methodB.....

這段代碼的打印結(jié)果是,methodA…..methodC…..會很快打印出來,methodB…..會隔一段時間才打印出來,那么methodB為什么不能像methodC那樣很快被調(diào)用呢?

在啟動線程1調(diào)用方法A后,接著會讓線程1休眠5秒鐘,這時會調(diào)用方法C,注意到方法C這里用synchronized進(jìn)行加鎖,這里鎖的對象是str這個字符串對象。但是方法B則不同,是用當(dāng)前對象this進(jìn)行加鎖,注意到方法A直接在方法上加synchronized,這個加鎖的對象是什么呢?顯然,這兩個方法用的是一把鎖。

*由這樣的結(jié)果,我們就知道這樣同步方法是用什么加鎖的了,由于線程1在休眠,這時鎖還沒釋放,導(dǎo)致線程2只有在5秒之后才能調(diào)用方法B,由此,可知兩種加鎖機制用的是同一個鎖對象,即當(dāng)前對象。

另外,同步方法直接在方法上加synchronized實現(xiàn)加鎖,同步代碼塊則在方法內(nèi)部加鎖,很明顯,同步方法鎖的范圍比較大,而同步代碼塊范圍要小點,一般同步的范圍越大,性能就越差,一般需要加鎖進(jìn)行同步的時候,肯定是范圍越小越好,這樣性能更好*。

感謝閱讀,希望能幫助到大家,謝謝大家對本站的支持!

相關(guān)文章

  • MyBatis-Plus標(biāo)簽@TableField之fill自動填充方式

    MyBatis-Plus標(biāo)簽@TableField之fill自動填充方式

    這篇文章主要介紹了MyBatis-Plus標(biāo)簽@TableField之fill自動填充方式,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-06-06
  • IntelliJ IDEA 安裝教程2019.09.23(最新版)

    IntelliJ IDEA 安裝教程2019.09.23(最新版)

    本文通過圖文并茂的形式給大家介紹了IntelliJ IDEA 安裝教程2019.09.23最新版,非常不錯,具有一定的參考借鑒價值,需要的朋友可以參考下
    2019-10-10
  • 解析SpringBoot自定義參數(shù)校驗注解

    解析SpringBoot自定義參數(shù)校驗注解

    這篇文章主要介紹了SpringBoot自定義參數(shù)校驗注解,引入依賴,spring validation是在hibernate-validator上做了一層封裝,文中提到了定義參數(shù)校驗注解與處理器的示例代碼,感興趣的朋友跟隨小編一起看看吧
    2023-10-10
  • Java代碼生成器的制作流程詳解

    Java代碼生成器的制作流程詳解

    這篇文章主要介紹了Java代碼生成器的制作流程詳解,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-07-07
  • java中redissonClient 分布式鎖的使用

    java中redissonClient 分布式鎖的使用

    在集群的情況下,用戶多次請求接口時,存入的內(nèi)容可能會導(dǎo)致重復(fù),這時候就可以使用分布式鎖來限制,本文就來介紹一下java中redissonClient 分布式鎖的使用,感興趣的可以了解一下
    2024-03-03
  • Spring MVC 圖片的上傳和下載功能

    Spring MVC 圖片的上傳和下載功能

    SSM 框架是一種基于Java的Web開發(fā)框架,其中Spring作為控制層、SpringMVC作為視圖層、MyBatis作為持久層,這個框架非常適合Web應(yīng)用程序的開發(fā),這篇文章主要介紹了Spring MVC 圖片的上傳和下載功能,需要的朋友可以參考下
    2023-03-03
  • Java多線程知識點全面總結(jié)

    Java多線程知識點全面總結(jié)

    這篇文章主要介紹了Java多線程知識點全面總結(jié),具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-03-03
  • java 兩個數(shù)組合并的幾種方法

    java 兩個數(shù)組合并的幾種方法

    本篇文章主要介紹了java 兩個數(shù)組合并的方法,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-08-08
  • 探索Java中private方法添加@Transactional事務(wù)未生效原因

    探索Java中private方法添加@Transactional事務(wù)未生效原因

    你又遇到過明明給private方法添加了@Transactional但是事務(wù)依然沒有生效的情況嗎,具體原因本篇文章將詳細(xì)告訴你,有需要的朋友跟著小編往下看吧
    2021-11-11
  • 手把手帶你用java搞定青蛙跳臺階

    手把手帶你用java搞定青蛙跳臺階

    這篇文章主要給大家介紹了關(guān)于Java青蛙跳臺階問題的解決思路與代碼,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2021-08-08

最新評論

石泉县| 固始县| 丘北县| 莱州市| 金乡县| 和平区| 东宁县| 集贤县| 高台县| 甘孜县| 泰兴市| 兴义市| 三门县| 长治市| 安陆市| 邻水| 兰坪| 河北区| 齐齐哈尔市| 鹤山市| 贞丰县| 通江县| 大英县| 皋兰县| 靖州| 霍林郭勒市| 涞水县| 新建县| 如皋市| 松阳县| 利川市| 河西区| 象州县| 綦江县| 射阳县| 东源县| 宝应县| 衡阳市| 临夏县| 桃源县| 武邑县|