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


當一個線程進入一個對象的一個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 !") ;

    }

 

}

 

 

運行結果:

 

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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM