笔试:当一个线程进入一个对象的一个synchronized方法后,其它线程是否可进入此对象的其它方法? ?(2nd)...
當一個線程進入一個對象的一個synchronized方法后,其它線程是否可進入此對象的其它方法?(2nd)
?
日前在網上見到一道Java筆試試題,如題所述。給出的答案如下:
答:不能,一個對象的一個synchronized方法只能由一個線程訪問。
?
本人認為有些所答非所問。故寫了兩個demo進行測試。發現答案要分三種情況討論。
?
情況一:
當一個線程進入一個對象的一個synchronized方法后,其它線程訪問該對象的非同步方法。
代碼如下:
package com.mutithreading.Object;
?
public class InvokedObject
{
???
??? public synchronized void synchronizedMethod()
??? {
?????? System.out.println("Invoked synchronizedMethod !") ;
?????? try {
?????????? Thread.sleep(10000) ;
?????? } catch (InterruptedException e) {
?????????? e.printStackTrace();
?????? }
??? }
???
??? public void generalMethod()
??? {
?????? System.out.println("Invoked generalMethod ...") ;
??? }
?
}
?
?
package com.mutithreading.threads;
import com.mutithreading.Object.InvokedObject;
?
public class ThreadOne implements Runnable {
?
??? private InvokedObject object ;
???
??? public ThreadOne(InvokedObject object)
??? {
?????? this.object = object ;
??? }
???
??? public void run() {
??????
?????? object.synchronizedMethod() ;
?
??? }
?
}
?
?
package com.mutithreading.threads;
import com.mutithreading.Object.InvokedObject;
?
public class ThreadTwo implements Runnable {
?
??? private InvokedObject object ;
???
??? public ThreadTwo(InvokedObject object)
??? {
?????? this.object = object ;
??? }
?
??? public void run() {
?????? // TODO Auto-generated method stub
?????? object.generalMethod() ;
??? }
?
}
?
package com.mutithreading.client;
import com.mutithreading.Object.InvokedObject;
import com.mutithreading.threads.ThreadOne;
import com.mutithreading.threads.ThreadTwo;
?
public class Client {
?
??? /**
??? ?* @param args
??? ?*/
??? public static void main(String[] args) {
?
?????? InvokedObject object = new InvokedObject() ;
??????
?????? ThreadOne one = new ThreadOne(object) ;
?????? ThreadTwo two = new ThreadTwo(object) ;
??????
?????? Thread threadOne = new Thread(one) ;
?????? Thread threadTwo = new Thread(two) ;
??????
?????? threadOne.start() ;
?????? threadTwo.start() ;
?
??? }
?
}
?
運行結果:
| 一個線程在訪問一個對象的同步方法時,另一個線程可以同時訪問這個對象的非同步方法。 |
?
?
?
情況二:
當一個線程進入一個對象的一個synchronized方法后,其它線程也訪問該同步方法。
?
運行結果:
| 一個線程在訪問一個對象的同步方法時,另一個線程不能同時訪問這個同步方法。(代碼略) |
?
?
?
情況三:
當一個線程進入一個對象的一個synchronized方法后,其它線程同時訪問該對象的另一個同步方法。
?
此處僅給出對InvokedObject類做出的修改代碼:
package com.mutithreading.Object;
?
public class InvokedObject
{
???
??? public synchronized void synchronizedMethod1()
??? {
?????? System.out.println("Invoked synchronizedMethod1 !") ;
?????? try {
?????????? Thread.sleep(10000) ;
?????? } catch (InterruptedException e) {
?????????? e.printStackTrace();
?????? }
??? }
???
??? public synchronized void synchronizedMethod2()
??? {
?????? System.out.println("Invoked synchronizedMethod2 !") ;
??? }
?
}
?
?
運行結果:
| 一個線程在訪問一個對象的同步方法時,另一個線程不能同時訪問這個對象的另一個同步方法。 |
?
轉載于:https://www.cnblogs.com/duadu/archive/2009/04/26/6335672.html
總結
以上是生活随笔為你收集整理的笔试:当一个线程进入一个对象的一个synchronized方法后,其它线程是否可进入此对象的其它方法? ?(2nd)...的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: eclipse搜索关键字
- 下一篇: Map 四种获取 key 和 value