Java死锁简单实例

代码转自: http://leowzy.iteye.com/blog/740859

public class DeadLocker  implements Runnable
{
	int field_1;
	
	private Object lock_1=new int[1];
	
	int field_2;
	
	private Object lock_2=new int[1];
	
	public void method1(int value){
		synchronized (lock_1){	
			System.out.println(Thread.currentThread().getName()+ "lock1");
			synchronized (lock_2){
				field_1=0;field_2=0;
			}
		}
	}
	
	
	public void method2(int value){
		synchronized (lock_2){
			System.out.println(Thread.currentThread().getName()+ "lock2");
			synchronized (lock_1){
				field_1=0;field_2=0;
			}
		}
	}
	 

	@Override
	public void run()
	{
		method1(2);
		method2(1);
	}
	 
	public static void main(String[] args)
	{	
		DeadLocker d=new DeadLocker();
		Thread t1=new Thread(d,"Thread_monkey");
		Thread t2=new Thread(d,"Thread dolphin");
		t1.start();
		t2.start();
	}
}


程序的运行会产生很多种不同的结果,有的是顺利执行完毕,大多数都会产生死锁:

1. Thread_monkey lock1
Thread_monkey lock2
Thread dolphin lock1
Thread dolphin lock2
这种是顺利执行完毕的。因为monkey线程执行完毕后dolphin才开始执行。这种可以忽略。

2. Thread_monkey lock1
   Thread_monkey lock2
   Thread dolphin lock1
monkey在执行到method2()的时候,dolphin正好开始执行。
此时dolphin进入到了method1()的synchronized (lock_1),而monkey则进入到了method2()的synchronized(lock_2)。
这时两个线程分别在之前的synchronized块中锁定了对方接下来所要锁定的资源。
既是:
   线程         已锁定对象      需要对象
   monkey ->      lock_2          lock_1
   dolphin->      lock_1          lock_2

两个线程都在锁定了对方所需要的对象,同时等待对方释放自己需要的对象。
程序进入死锁状态。


具体细节都在上面的链接里。

你可能感兴趣的:(java,thread,死锁,deadlock)