java中synchroized锁的那个对象

以前有个误区,A对象中的一个synchroized(target)方法块,我以为获得的都是A对象的锁(无论target是写的什么对象)。

正确的应该是获得的锁应该是target对象的锁,和A对象没什么毛线关系。只有2种情况才是获得A对象锁,synchroized(this)和synchroized修饰在改对象的非静态方法前。

下面这段代码,2个线程,进入同一个对象,一个线程运行count1 ,一个线程运行count2,count1的加锁对象是o,count2的加锁对象是t,因此,当一个线程进入对象调用count1的时候,另一个对象是能够调用count2的,因为他们锁的是2个不同对象。

public class DifferentLock {

	Object o = new Object();
	Object t = new Object();

	public void count1() {
		synchronized (o) {
			try {
				Thread.sleep(5000);
			} catch (InterruptedException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
			System.out.println("count1");
		}
	}

	public void count2() {
		synchronized (t) {
			System.out.println("count2");
		}
	}

	public static void main(String[] args)
	{
		DifferentLock p = new DifferentLock();
		Thread t1 = new Thread(new TestThread(p));
		t1.start();
		Thread t2 = new Thread(new TestThread2(p));
		t2.start();
	}
}

class TestThread implements Runnable {

	DifferentLock o;
	public TestThread(DifferentLock o)
	{
		this.o = o;
	}
	@Override
	public void run() {
		 o.count1();
	}

}
class TestThread2 implements Runnable {

	DifferentLock o;
	public TestThread2(DifferentLock o)
	{
		this.o = o;
	}
	@Override
	
	public void run() {
		while(true)
		{
			 o.count2();
		}
		
	}

}

我认识到这个是因为看了这篇文章:

http://buaawhl.iteye.com/blog/1160400

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值