當有多個線程訪問多個共享資源時會發生死鎖,那死鎖是如何產生的呢?
用Java模擬如下:
/**
* 死鎖
*/
class DeadLock implements Runnable
{
private boolean flag;
public DeadLock(boolean flag)
{
this.flag=flag;
}
public void run()
{
if(flag)
{
synchronized(MyLock.obj1)//-->obj1 (1)
{
System.out.println(Thread.currentThread().getName()+"if................obj1");
synchronized(MyLock.obj2)// 出現死鎖,obj2已給(2)拿了......等待(2)放開obj2..... (3)
{
System.out.println("if.......obj2");
}
}
}
else
{
synchronized(MyLock.obj2)//-->obj2 (2)
{
System.out.println(Thread.currentThread().getName()+"else................obj2");
synchronized(MyLock.obj1)//出現死鎖,obj1已給(1)拿了......等待(1)放開obj1..... (4)
{
System.out.println("else.......obj1");
}
}
}
}
}
測試一把:
public static void main(String[] args)
{
DeadLock lock1 = new DeadLock(true);
DeadLock lock2 = new DeadLock(false);
Thread t1 = new Thread(lock1);
Thread t2 = new Thread(lock2);
t1.start();
t2.start();
}
運氣好的話你會看到這樣子:
運氣更好的話你會發現控制檯一直沒反應,根本停不下來!這就是傳說中的死鎖了: