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

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,由此,可知兩種加鎖機(jī)制用的是同一個鎖對象,即當(dāng)前對象。

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

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

相關(guān)文章

  • Java算法之桶排序Bucket?Sort詳解

    Java算法之桶排序Bucket?Sort詳解

    這篇文章主要介紹了Java算法之桶排序Bucket?Sort詳解,桶排序(Bucket?Sort)又稱箱排序,是一種比較常用的排序算法,其算法原理是將數(shù)組分到有限數(shù)量的桶里,再對每個桶分別排好序,最后一次將每個桶中排好序的數(shù)輸出,需要的朋友可以參考下
    2023-10-10
  • MyBatis之自查詢使用遞歸實(shí)現(xiàn) N級聯(lián)動效果(兩種實(shí)現(xiàn)方式)

    MyBatis之自查詢使用遞歸實(shí)現(xiàn) N級聯(lián)動效果(兩種實(shí)現(xiàn)方式)

    這篇文章主要介紹了MyBatis之自查詢使用遞歸實(shí)現(xiàn) N級聯(lián)動效果,本文給大家分享兩種實(shí)現(xiàn)方式,需要的的朋友參考下吧
    2017-07-07
  • Java 實(shí)現(xiàn)滑動時間窗口限流算法的代碼

    Java 實(shí)現(xiàn)滑動時間窗口限流算法的代碼

    這篇文章主要介紹了Java 實(shí)現(xiàn)滑動時間窗口限流算法的代碼,本文通過實(shí)例代碼給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2020-11-11
  • 淺談Java模板引擎性能對比

    淺談Java模板引擎性能對比

    本篇文章主要介紹了淺談Java模板引擎性能對比 ,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-09-09
  • DynamicDataSource怎樣解決多數(shù)據(jù)源的事務(wù)問題

    DynamicDataSource怎樣解決多數(shù)據(jù)源的事務(wù)問題

    這篇文章主要介紹了DynamicDataSource怎樣解決多數(shù)據(jù)源的事務(wù)問題,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2023-07-07
  • Spring Boot打開URL出現(xiàn)signin問題的解決

    Spring Boot打開URL出現(xiàn)signin問題的解決

    這篇文章主要介紹了Spring Boot打開URL出現(xiàn)signin問題的解決,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-12-12
  • maven加載依賴報錯的原因分析及解決方法

    maven加載依賴報錯的原因分析及解決方法

    通常我們在項(xiàng)目中引入第三方依賴包時,為了避免其版本迭代問題,經(jīng)常會使用本地的包,這篇文章主要給大家介紹了關(guān)于maven加載依賴報錯的原因分析及解決方法的相關(guān)資料,需要的朋友可以參考下
    2023-10-10
  • Java阻塞隊列四組API介紹(小結(jié))

    Java阻塞隊列四組API介紹(小結(jié))

    這篇文章主要介紹了Java阻塞隊列四組API介紹,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-05-05
  • Java中的 VO,BO,DO 對象命名問題小結(jié)

    Java中的 VO,BO,DO 對象命名問題小結(jié)

    本文講解VO,BO,DO 的作用以及如何使用,分析了如何消除三者之間重復(fù)的代碼,同樣結(jié)合現(xiàn)實(shí)生活中領(lǐng)導(dǎo)配秘書來類比講解,對Java  VO  對象命名相關(guān)知識感興趣的朋友一起看看吧
    2024-01-01
  • JVM 的 noverify 啟動參數(shù)問題解析

    JVM 的 noverify 啟動參數(shù)問題解析

    這篇文章主要介紹了JVM 的 noverify 啟動參數(shù)問題解析,從 JDK 13 開始及其后續(xù)版本中,不建議繼續(xù)使用?-Xverify:none?和-noverify?參數(shù),本文給大家介紹的非常詳細(xì),需要的朋友可以參考下
    2023-05-05

最新評論