日期:2014-05-20  浏览次数:20628 次

java死锁造成的原因
class Obj{
static Object obj1=new Object();
static Object obj2=new Object();
}
class Sisuo implements Runnable{
boolean flag=true;
public Sisuo(boolean flag){
this.flag=flag;
}
public void run(){
if(flag)
synchronized (Obj.obj1) {//死锁造成的原因是不是因为,一个synchronized拿着obj1变量,另一个synchronized拿着另一个拿着 obj2,这两个都想要对方的变量,可是变量已经在使用,
System.out.println("obj1----if");
synchronized (Obj.obj2) {
try {
Thread.sleep(10);
} catch (Exception e) {
// TODO: handle exception
}
System.out.println("obj2----if");
}
}
else
synchronized (Obj.obj2) {
System.out.println("obj2----else");
synchronized (Obj.obj1) {
try {
Thread.sleep(10);
} catch (Exception e) {
// TODO: handle exception
}
System.out.println("obj1----else");
}
}
}
}
class Test{
public static void main(String[] args){
//Sisuo xiaosi=new Sisuo();
Thread t1=new Thread(new Sisuo(true));
Thread t2=new Thread(new Sisuo(false));
t1.start();
//Sisuo.flag=false;
t2.start();
}
}


死锁造成的原因是不是因为,一个synchronized拿着obj1变量,另一个synchronized拿着另一个拿着 obj2,这两个都想要对方的变量,可是对方变量已经在使用,导致另一个线程无法操作?。关键在于变量已经使用?
线程

------解决方案--------------------
恩。你得到一份东西,需要等待一份东西,才能完成任务。
等待的东西,别人正在使用。你不得到,就不能将手中的物品释放。

对面和你出现同样的情况。

AB BA 都可以完成任务。 

A---->need B

B---->need A

死锁了。
------解决方案--------------------
是的。两个线程都要等待对方所拥有的变量的锁,又得不到。死锁了。