久久国产成人av_抖音国产毛片_a片网站免费观看_A片无码播放手机在线观看,色五月在线观看,亚洲精品m在线观看,女人自慰的免费网址,悠悠在线观看精品视频,一级日本片免费的,亚洲精品久,国产精品成人久久久久久久

分享

當一個線程進入一個對象的一個synchronized方法后,,其它線程是否可進入此對象的其它方法?

 橙zc 2014-09-24
當一個線程進入一個對象的一個synchronized方法后,,其它線程是否可進入此對象的其它方法?

日前在網上見到一道Java筆試試題,如題所述,。給出的答案如下:

答:不能,,一個對象的一個synchronized方法只能由一個線程訪問。

本人認為有些所答非所問,。故寫了兩個demo進行測試,。發(fā)現(xiàn)答案要分三種情況討論。

  • 情況一:

當一個線程進入一個對象的一個synchronized方法后,,其它線程訪問該對象的非同步方法,。
代碼如下:

Java代碼
  1. package com.mutithreading.Object;   
  2.   
  3. public class InvokedObject  
  4. {  
  5.     public synchronized void synchronizedMethod()  
  6.     {  
  7.        System.out.println("Invoked synchronizedMethod !") ;  
  8.        try {  
  9.            Thread.sleep(10000) ;  
  10.        } catch (InterruptedException e) {  
  11.            e.printStackTrace();  
  12.        }  
  13.     }  
  14.   
  15.     public void generalMethod()  
  16.     {  
  17.        System.out.println("Invoked generalMethod ...") ;  
  18.     }  
  19. }  
  20.   
  21. package com.mutithreading.threads;  
  22. import com.mutithreading.Object.InvokedObject;  
  23.   
  24. public class ThreadOne implements Runnable {  
  25.     private InvokedObject object ;  
  26.     public ThreadOne(InvokedObject object)  
  27.     {  
  28.        this.object = object ;  
  29.     }  
  30.     public void run() {  
  31.        object.synchronizedMethod() ;  
  32.     }  
  33. }  
  34.   
  35. package com.mutithreading.threads;  
  36.   
  37. import com.mutithreading.Object.InvokedObject;  
  38. public class ThreadTwo implements Runnable {  
  39.     private InvokedObject object ;  
  40.     public ThreadTwo(InvokedObject object)  
  41.     {  
  42.        this.object = object ;  
  43.     }  
  44.     public void run() {  
  45.        // TODO Auto-generated method stub  
  46.        object.generalMethod() ;  
  47.     }  
  48. }  
  49.   
  50. package com.mutithreading.client;  
  51. import com.mutithreading.Object.InvokedObject;  
  52. import com.mutithreading.threads.ThreadOne;  
  53. import com.mutithreading.threads.ThreadTwo;  
  54.   
  55. public class Client {  
  56.     public static void main(String[] args) {  
  57.     InvokedObject object = new InvokedObject() ;  
  58.     ThreadOne one = new ThreadOne(object) ;  
  59.     ThreadTwo two = new ThreadTwo(object) ;  
  60.     Thread threadOne = new Thread(one) ;  
  61.     Thread threadTwo = new Thread(two) ;  
  62.    
  63.     threadOne.start() ;  
  64.     threadTwo.start() ;  
  65. }  
  66. }  



運行結果:

一個線程在訪問一個對象的同步方法時,另一個線程可以同時訪問這個對象的非同步方法,。


  • 情況二:


當一個線程進入一個對象的一個synchronized方法后,,其它線程也訪問該同步方法,。


運行結果:

一個線程在訪問一個對象的同步方法時,另一個線程不能同時訪問這個同步方法,。(代碼略)


  • 情況三:


當一個線程進入一個對象的一個synchronized方法后,,其它線程同時訪問該對象的另一個同步方法,。

此處僅給出對InvokedObject類做出的修改代碼:

Java代碼
  1. package com.mutithreading.Object;  
  2. public class InvokedObject  
  3. {  
  4.     public synchronized void synchronizedMethod1()  
  5.     {  
  6.        System.out.println("Invoked synchronizedMethod1 !") ;  
  7.        try {  
  8.            Thread.sleep(10000) ;  
  9.        } catch (InterruptedException e) {  
  10.            e.printStackTrace();  
  11.        }  
  12.     }     
  13.     public synchronized void synchronizedMethod2()  
  14.     {  
  15.        System.out.println("Invoked synchronizedMethod2 !") ;  
  16.     }  
  17. }  



運行結果:

一個線程在訪問一個對象的同步方法時,,另一個線程不能同時訪問這個對象的另一個同步方法。

    本站是提供個人知識管理的網絡存儲空間,,所有內容均由用戶發(fā)布,,不代表本站觀點。請注意甄別內容中的聯(lián)系方式,、誘導購買等信息,,謹防詐騙。如發(fā)現(xiàn)有害或侵權內容,,請點擊一鍵舉報,。
    轉藏 分享 獻花(0

    0條評論

    發(fā)表

    請遵守用戶 評論公約

    類似文章 更多