线程篇 - synchronized 关键字,为什么同一对象中不能死锁?

今天老大让模拟一个线程死锁的情况,我说那还不简单!Give me 3 minutes!

我的脑海里马上浮现了最简单的轮廓:两个 synchironized方法,互相调用就OK了!

可,事与愿违,先看我的程序,很简单,两个函数相互调用

class ObjectA
{
	public ObjectA()
	{
	}
	
	public synchronized void methodA()
	{
		System.out.println("Call A.method()");

		try
		{
                        //Simulate 500ms processing
			Thread.sleep(500);
		}
		catch(Exception e)
		{
		}

		methodB();
	}
	
	public synchronized void methodB()
	{
		System.out.println("Call B.method()");

		try
		{
                         //Simulate 500ms processing
			Thread.sleep(500);
		}
		catch(Exception e)
		{
		}

		methodA();			
	}
	}
}


然后同时启动两个线程,一个线程调用methodA(),一个调用methodB(),都是用这个类的实例对象,理论上应该锁住,可是很奇怪,居然没有死锁!!!!!
而是很顺利打出
......
Call B.method()
Call A.method()
Call B.method()
Call A.method()
......

这下我晕了,怎么回子事?????
开始猜测,是不是两个线程都完好启动,并分别调用两个方法?
然后将控制台打印改为
System.out.println("Call B.method() " + Thread.currentThread().getId());

结果打出
......
Call B.method() 8
Call A.method() 8
Call B.method() 8
Call A.method() 8
......
我的神啊,一个线程启动了一直在等待!也就是说同一个对象所有方法会共享一个 synchironized同步,此例中,两个同步方法共享一个锁。

如果在一个对象的实例中有多个同步的方法,那么这些方法将共享一个同步锁,也是就是
对于
synchronized void m1(){}
synchronized void m2(){}

当一个线程调用m1()方法并没有释放锁时,其他线程在调用m1(),或m2()方法时会阻塞等待。

想要得到死锁,搞两个对象就Ok了!

解决!

你可能感兴趣的:(thread)