Java SE之旅_04_死鎖

當有多個線程訪問多個共享資源時會發生死鎖,那死鎖是如何產生的呢?

用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();
	}


運氣好的話你會看到這樣子:


運氣更好的話你會發現控制檯一直沒反應,根本停不下來!這就是傳說中的死鎖了:





發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章