代码转自: [url]http://leowzy.iteye.com/blog/740859[/url]
程序的运行会产生很多种不同的结果,有的是顺利执行完毕,大多数都会产生死锁:
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
两个线程都在锁定了对方所需要的对象,同时等待对方释放自己需要的对象。
程序进入死锁状态。
具体细节都在上面的链接里。
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
两个线程都在锁定了对方所需要的对象,同时等待对方释放自己需要的对象。
程序进入死锁状态。
具体细节都在上面的链接里。