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

Java 中synchronize函數(shù)的實例詳解

 更新時間:2017年09月18日 11:17:20   投稿:lqh  
這篇文章主要介紹了Java 中synchronize函數(shù)的實例詳解的相關(guān)資料,希望通過本文能幫助到大家理解使用synchronize函數(shù)的使用方法,需要的朋友可以參考下

Java 中synchronize函數(shù)的實例詳解

java中的一個類的成員函數(shù)若用synchronized來修飾,則對應(yīng)同一個對象,多個線程像調(diào)用這個對象的這個同步函數(shù)時必須等到上一個線程調(diào)用完才能由下一個線程調(diào)用。

那么如果一個類同時有兩個成員函數(shù)是由synchronized修飾如代碼所示,對與同一個對象,是否可以在兩個線程運(yùn)行時,一個調(diào)用funcA,同時另一個調(diào)用funcB?

Mysyn是這樣一個類,如果我有兩個線程,一個在run方法中先運(yùn)行funcA再運(yùn)行funcB,另一個線程在run方法中先運(yùn)行funcB再運(yùn)行funcA。那有沒有可能出現(xiàn)這樣的情況:在輸出時start A...后面直接輸出start B...?

public class MySyn { 
  public synchronized void funcA(String str){ 
    System.out.println(str+":"); 
    System.out.println("start A..."); 
    try { 
      Thread.sleep(5000); 
    } catch (InterruptedException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
    } 
    System.out.println("...A end"); 
  } 
   
  public synchronized void funcB(String str){ 
    System.out.println(str+":"); 
    System.out.println("start B..."); 
    try { 
      Thread.sleep(5000); 
    } catch (InterruptedException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
    } 
    System.out.println("...B end"); 
  } 
} 

測試代碼如下:

這個線程是先運(yùn)行funcA的

public class Mythread implements Runnable { 
 
  private MySyn mysyn; 
  private String id; 
  public Mythread(MySyn syn, String id){ 
    this.mysyn = syn; 
    this.id = id; 
  } 
  @Override 
  public void run() { 
     
    this.mysyn.funcA(id); 
    try { 
      Thread.sleep(1000); 
    } catch (InterruptedException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
    } 
    this.mysyn.funcB(id); 
  } 
   
  public static void main(String arg[]){ 
    MySyn syn=new MySyn(); 
    Thread t1 = new Thread(new Mythread(syn, "t1")); 
    Thread t2 = new Thread(new YourThread(syn, "t2")); 
     
     
    t1.start(); 
    t2.start(); 
  } 
 
} 

這個線程是先運(yùn)行funcB的

public class YourThread implements Runnable { 
 
  private MySyn mysyn; 
  private String id; 
  public YourThread(MySyn syn, String id){ 
    this.mysyn = syn; 
    this.id=id; 
  } 
  @Override 
  public void run() { 
    this.mysyn.funcB(id); 
    this.mysyn.funcA(id); 
     
 
  } 
 
} 

輸出結(jié)果多是:

t1: 
start A... 
...A end 
t2: 
start B... 
...B end 
t2: 
start A... 
...A end 
t1: 
start B... 
...B end 

如果取消Mythread的run方法中兩個函數(shù)調(diào)用間的sleep,那結(jié)果多是:

t1: 
start A... 
...A end 
t1: 
start B... 
...B end 
t2: 
start B... 
...B end 
t2: 
start A... 
...A end 

個人結(jié)果可能因線程調(diào)度不同,但是永遠(yuǎn)不會有:start A...后面直接輸出start B...

那如果funcB不是一個同步函數(shù),那上述代碼運(yùn)行結(jié)果會是怎么樣呢?

代碼稍加改動,把funcB的synchronized關(guān)鍵字去掉。運(yùn)行結(jié)果為:

t2: 
t1: 
start A... 
start B... 
...A end 
t1: 
start B... 
...B end 
t2: 
start A... 
...B end 
...A end 

顯然出現(xiàn)了start A...后面直接輸出start B...的結(jié)果。

同樣如果Mysyn類如果有一個public 的成員變量,多線程也可以再同步函數(shù)被調(diào)用的同時,由另一個線程修改這個成員變量。

上述實驗說明了:同步的成員函數(shù)只能在同一個對象的同步函數(shù)調(diào)用中對其他同步函數(shù)(包括本身)有排它的效果,即多線程運(yùn)行中,同一個對象當(dāng)前只能有一個同步函數(shù)在運(yùn)行,但不排除其他非同步函數(shù)的運(yùn)行或?qū)Τ蓡T進(jìn)行訪問。

 那現(xiàn)在假設(shè)某個類有兩個靜態(tài)同步方法,那情況怎么樣呢?

具體實現(xiàn),我就不重復(fù)了,因為結(jié)果類似:

在多線程中,同一個類,當(dāng)前只能有一個類同步函數(shù)(靜態(tài)同步函數(shù))在運(yùn)行,但不排除其他非同步靜態(tài)函數(shù)的運(yùn)行或?qū)o態(tài)成員的訪問

如有疑問請留言或者到本站社區(qū)交流討論,感謝閱讀,希望能幫助到大家,謝謝大家對本站的支持!

相關(guān)文章

  • Java后端接入微信小程序登錄功能(登錄流程)

    Java后端接入微信小程序登錄功能(登錄流程)

    這篇文章主要介紹了Java后端接入微信小程序登錄功能,本文通過實例代碼給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2023-06-06
  • Spring的@ComponentScan注解用法介紹

    Spring的@ComponentScan注解用法介紹

    這篇文章主要介紹了Spring的@ComponentScan注解用法介紹,@ComponentScan注解一般和@Configuration注解一起使用,主要的作用就是定義包掃描的規(guī)則,然后根據(jù)定義的規(guī)則找出哪些需類需要自動裝配到spring的bean容器中,然后交由spring進(jìn)行統(tǒng)一管理,需要的朋友可以參考下
    2023-11-11
  • SpringBoot JPA 表關(guān)聯(lián)查詢實例

    SpringBoot JPA 表關(guān)聯(lián)查詢實例

    本篇文章主要介紹了SpringBoot JPA 表關(guān)聯(lián)查詢實例,使用JPA原生的findBy語句實現(xiàn),具有一定的參考價值,有興趣的可以了解一下。
    2017-04-04
  • 詳解springboot-mysql-pagehelper分頁插件集成

    詳解springboot-mysql-pagehelper分頁插件集成

    這篇文章主要介紹了springboot-mysql-pagehelper分頁插件集成,本文通過實例代碼給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2023-07-07
  • Java Gradle項目中的資源正確獲取方式

    Java Gradle項目中的資源正確獲取方式

    這篇文章主要介紹了Java Gradle項目中的資源正確獲取方式,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-11-11
  • 淺談JVM之類的加載鏈接和初始化

    淺談JVM之類的加載鏈接和初始化

    有了java class文件之后,為了讓class文件轉(zhuǎn)換成為JVM可以真正運(yùn)行的結(jié)構(gòu),需要經(jīng)歷加載,鏈接和初始化的過程。這三個過程是怎么工作的呢?在本文中你將會找到答案。
    2021-06-06
  • Java實現(xiàn)對象轉(zhuǎn)CSV格式

    Java實現(xiàn)對象轉(zhuǎn)CSV格式

    CSV是一種逗號分隔值格式的文件,一般用來存儲數(shù)據(jù)的純文本格式文件。Java對象轉(zhuǎn)CSV,有現(xiàn)成的工具包,commons-lang3 的ReflectionToStringBuilder 就可以簡單的解決的對象轉(zhuǎn)CSV,快跟隨小編一起學(xué)習(xí)一下吧
    2022-06-06
  • springMVC之HandlerExceptionResolver使用

    springMVC之HandlerExceptionResolver使用

    這篇文章主要介紹了springMVC之HandlerExceptionResolver使用,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-11-11
  • @PathParam和@QueryParam區(qū)別簡析

    @PathParam和@QueryParam區(qū)別簡析

    這篇文章主要介紹了@PathParam和@QueryParam區(qū)別,分享了相關(guān)實例代碼,小編覺得還是挺不錯的,具有一定借鑒價值,需要的朋友可以參考下
    2018-01-01
  • Java的SpringMVC中控制器返回XML數(shù)據(jù)問題

    Java的SpringMVC中控制器返回XML數(shù)據(jù)問題

    這篇文章主要介紹了Java的SpringMVC中控制器返回XML數(shù)據(jù)問題,控制器是處理HTTP請求的組件,它們接收來自客戶端的請求,并將其轉(zhuǎn)換為適當(dāng)?shù)捻憫?yīng),這些響應(yīng)可以是動態(tài)生成的?HTML?頁面,也可以是JSON或XML格式的數(shù)據(jù),需要的朋友可以參考下
    2023-07-07

最新評論

西昌市| 繁峙县| 新安县| 四会市| 靖远县| 遂宁市| 京山县| 调兵山市| 云阳县| 会东县| 西安市| 廊坊市| 河池市| 乐至县| 博湖县| 襄垣县| 金平| 都匀市| 鲜城| 福州市| 瑞金市| 西和县| 奉化市| 东丽区| 法库县| 抚宁县| 吴江市| 岗巴县| 深州市| 肇州县| 南靖县| 佛冈县| 东乡县| 镇宁| 新巴尔虎右旗| 灌南县| 洱源县| 无棣县| 高青县| 游戏| 抚顺市|