當一個線程進入一個對象的一個synchronized方法后,,其它線程是否可進入此對象的其它方法? 日前在網上見到一道Java筆試試題,如題所述,。給出的答案如下: 答:不能,,一個對象的一個synchronized方法只能由一個線程訪問。 本人認為有些所答非所問,。故寫了兩個demo進行測試,。發(fā)現(xiàn)答案要分三種情況討論。 當一個線程進入一個對象的一個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 {
- 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 !") ;
- }
- }
運行結果: 一個線程在訪問一個對象的同步方法時,,另一個線程不能同時訪問這個對象的另一個同步方法。
|