Skip to content

Latest commit

 

History

History
138 lines (106 loc) · 1.85 KB

3-4-案例-死锁.md

File metadata and controls

138 lines (106 loc) · 1.85 KB
layout title date updated tags categories permalink thumbnail toc comment notag top
3-4-案例-死锁
2015-10-10
2015-10-10
Java多线程
Java多线程基础
Java多线程案例
Java多线程基础
true
true
false
false

死锁

同步的另一个弊端:

情况之一:当线程任务中出现了多个同步(多个锁)时,如果同步中嵌套了其他的同步。 这时容易引发一种现象:死锁。 这种情况能避免就避免掉。

//Thread-0
synchronized(obj1)
{
	-->thread-0  obj1
	synchronized(obj2)
	{
		
	}

}
//Thread-1
synchronized(obj2)
{
	Thread-1 obj2
	synchronized(obj1)
	{
		
	}

}

死锁示例

class Test implements Runnable
{
	private boolean flag;
	Test(boolean flag)
	{
		this.flag = flag;
	}

	public void run()
	{
		if(flag)
		{
			while(true)
			{
				synchronized(MyLock.LOCKA)
				{
					System.out.println(Thread.currentThread().getName()+"...if......locka");
					synchronized(MyLock.LOCKB)
					{
						System.out.println(Thread.currentThread().getName()+"...if......lockb");
					}
				}
			}
		}
		else
		{
			while(true)
			{
				synchronized(MyLock.LOCKB)
				{
					System.out.println(Thread.currentThread().getName()+"...else......lockb");
					synchronized(MyLock.LOCKA)
					{
						System.out.println(Thread.currentThread().getName()+"...else......locka");
					}
				}
			}
		}
	}
}
//定义一个用于存储锁对象类。
class MyLock
{
	public static final Object LOCKA = new Object();
	public static final Object LOCKB = new Object();
}

class DeadLockTest 
{
	public static void main(String[] args) 
	{
		//创建两个线程任务。
		Test t1 = new Test(true);
		Test t2 = new Test(false);
		
		Thread t11 = new Thread(t1);
		Thread t22 = new Thread(t2);
		t11.start();
		t22.start();

	}
}

执行结果

Thread-0if ... lock a
Thread-1else ... lock b