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

当一个线程进入一个对象的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 stub
		Thread 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),因此,静态方法可以被调用

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值