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

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

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

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

問題的由來:

看到這樣一個(gè)面試題:

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

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

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

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

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會(huì)隔一段時(shí)間才會(huì)打印出來
methodB.....

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

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

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

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

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

相關(guān)文章

  • Spring MVC 更靈活的控制 json 返回問題(自定義過濾字段)

    Spring MVC 更靈活的控制 json 返回問題(自定義過濾字段)

    本篇文章主要介紹了Spring MVC 更靈活的控制 json 返回問題(自定義過濾字段),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下。
    2017-02-02
  • Spring Security 中細(xì)化權(quán)限粒度的方法

    Spring Security 中細(xì)化權(quán)限粒度的方法

    這篇文章主要介紹了Spring Security 中細(xì)化權(quán)限粒度的方法,本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2020-09-09
  • java實(shí)習(xí)--每天打卡十道面試題!

    java實(shí)習(xí)--每天打卡十道面試題!

    臨近秋招,備戰(zhàn)暑期實(shí)習(xí),祝大家每天進(jìn)步億點(diǎn)點(diǎn)!本篇文章準(zhǔn)備了十道java的常用面試題,希望能夠給大家提供幫助,最后祝大家面試成功,進(jìn)入自己心儀的大廠
    2021-06-06
  • Java獲取當(dāng)前操作系統(tǒng)的信息實(shí)例代碼

    Java獲取當(dāng)前操作系統(tǒng)的信息實(shí)例代碼

    這篇文章主要介紹了Java獲取當(dāng)前操作系統(tǒng)的信息實(shí)例代碼,具有一定借鑒價(jià)值,需要的朋友可以參考下。
    2017-12-12
  • Java中將base64編碼字符串轉(zhuǎn)換為圖片的代碼

    Java中將base64編碼字符串轉(zhuǎn)換為圖片的代碼

    這篇文章主要介紹了Java中將base64編碼字符串轉(zhuǎn)換為圖片,本文通過實(shí)例代碼給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2023-03-03
  • java收集器Collector案例匯總

    java收集器Collector案例匯總

    這篇文章主要介紹了java收集器Collector案例匯總,Collectors作為Stream的collect方法的參數(shù),Collector是一個(gè)接口,它是一個(gè)可變的匯聚操作,更多相關(guān)介紹,需要的朋友可以參考下
    2022-06-06
  • Java實(shí)現(xiàn)int、long、Integer、Long之間的相互轉(zhuǎn)換

    Java實(shí)現(xiàn)int、long、Integer、Long之間的相互轉(zhuǎn)換

    本文主要介紹了Java實(shí)現(xiàn)int、long、Integer、Long之間的相互轉(zhuǎn)換,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2023-08-08
  • Java中對象的克隆詳解

    Java中對象的克隆詳解

    這篇文章主要介紹了Java中對象的克隆詳解,Java中對象的復(fù)制分為淺復(fù)制與深復(fù)制的不同之處就在于深復(fù)制還會(huì)復(fù)制對象的引用對象,需要的朋友可以參考下
    2023-08-08
  • Java 網(wǎng)絡(luò)爬蟲基礎(chǔ)知識入門解析

    Java 網(wǎng)絡(luò)爬蟲基礎(chǔ)知識入門解析

    這篇文章主要介紹了Java 網(wǎng)絡(luò)爬蟲基礎(chǔ)知識入門解析,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2019-10-10
  • Spring的初始化前中后詳細(xì)解讀

    Spring的初始化前中后詳細(xì)解讀

    這篇文章主要介紹了Spring的初始化前中后詳細(xì)解讀,Spring?框架是一個(gè)非常流行的?Java?框架,它提供了一種輕量級的、可擴(kuò)展的方式來構(gòu)建企業(yè)級應(yīng)用程序,在?Spring?的生命周期中,有三個(gè)重要的階段,即初始化前、初始化、初始化后,需要的朋友可以參考下
    2023-09-09

最新評論

东方市| 凌源市| 晴隆县| 嘉义市| 大渡口区| 赤壁市| 邓州市| 通渭县| 富川| 黄冈市| 黄骅市| 永靖县| 介休市| 当阳市| 固原市| 鹤岗市| 密山市| 吴江市| 灌云县| 新竹市| 双城市| 犍为县| 宣恩县| 婺源县| 乌兰察布市| 普兰店市| 农安县| 桐庐县| 广河县| 三河市| 临沧市| 常州市| 尖扎县| 巢湖市| 修文县| 鱼台县| 合肥市| 张掖市| 乌兰察布市| 澜沧| 开原市|