当一个线程进入一个对象的synchronized() 方法后,其他线程是否可以进入此对象的其他方法

来源:互联网 发布:软件板块指数 编辑:程序博客网 时间:2024/05/02 01:50

当一个线程进入一个对象的synchronized() 方法后,其他线程是否可以进入此对象的其他方法?

1、其他方法generalMethod() 没有加入synchronized修饰符

<span style="font-size:18px;">package thread;public class Test {public synchronized void synchronizedMethod(){System.out.println("begin calling synchronizedMethod");try{Thread.sleep(5000);}catch(InterruptedException e){e.printStackTrace();}System.out.println("finish calling synchronizedMethod");}public   void generalMethod(){System.out.println("calling generalMethod");}}</span>

<span style="font-size:18px;">package thread;public class MultiThread {static final Test t = new Test();public static void main(String[] args) {// TODO Auto-generated method stubThread t1 = new Thread(){public void run(){t.synchronizedMethod();}};Thread t2 = new Thread(){public void run(){t.generalMethod();}};t1.start();t2.start();}}</span>
结果:

begin calling synchronizedMethod
calling generalMethod
finish calling synchronizedMethod

结论:当一个线程进入一个对象多个一个synchronize()方法后,其他线程是否可以进入该对象的其他方法取决于方法本身,如果该方法是非synchronized()方法,那么是可以访问的。

2、其他方法generalMethod() 加入synchronized修饰符

<span style="font-size:18px;">package thread;public class Test {public synchronized void synchronizedMethod(){System.out.println("begin calling synchronizedMethod");try{Thread.sleep(5000);}catch(InterruptedException e){e.printStackTrace();}System.out.println("finish calling synchronizedMethod");}public synchronized  void generalMethod(){System.out.println("calling generalMethod");}}</span>
结果:

begin calling synchronizedMethod
finish calling synchronizedMethod
calling generalMethod

结论:当一个线程进入一个对象多个一个synchronize()方法后,其他线程是否可以进入该对象的其他方法取决于方法本身,如果该方法是synchronized()方法,那么是不可以访问的。

3、其他方法generalMethod() 加入synchronized static 修饰符

<span style="font-size:18px;">package thread;public class Test {public synchronized void synchronizedMethod(){System.out.println("begin calling synchronizedMethod");try{Thread.sleep(5000);}catch(InterruptedException e){e.printStackTrace();}System.out.println("finish calling synchronizedMethod");}public synchronized static void generalMethod(){System.out.println("calling generalMethod");}}</span>
结果:

begin calling synchronizedMethod
calling generalMethod
finish calling synchronizedMethod
结论:如果其他方法是静态方法,它用的同步锁是当前类的字节码,与非晶态的方法不能同步(因为非静态的方法用的是this),因此,静态方法可以被调用

0 0
原创粉丝点击