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


對象的synchronized方法不能進入了,但它的其他非synchronized方法還是可以訪問的

對每一個class只有一個thread可以執行synchronized static method。每個class的instance只有一個thread可以執行synchronized method。任意數目的thread可以執行非synchronized method——不管是否是static。

情況一:

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

    }

 

}

 

 

運行結果:

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


情況一:

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

    }

 

}

 

 

運行結果:

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


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章