日期:2014-05-18  浏览次数:20754 次

关于死锁的问题,最初级的代码。求简答。
package morethread;

class MyLock
{
static Object obja = new Object();
static Object objb = new Object();
}

class Demo implements Runnable
{


boolean flag;

Demo(boolean flag)
{
this.flag = flag;
}

public void run()
{
if(flag)
synchronized(MyLock.obja)
{
System.out.println(Thread.currentThread().getName()+"obja");
synchronized(MyLock.objb)
{
System.out.println(Thread.currentThread().getName()+"objb");
}
}

else
synchronized(MyLock.objb)
{
System.out.println(Thread.currentThread().getName()+"objb");
synchronized(MyLock.obja)
{
System.out.println(Thread.currentThread().getName()+"obja");
}
}
}
}




public class DeadLockDemo
{
public static void main(String[] args)
{
Demo d1 = new Demo(true);
Demo d2 = new Demo(false);

Thread t1 = new Thread(d1);
Thread t2 = new Thread(d2);

t1.start();
t2.start();
}
}


在我的eclipse中的输出如下:
Thread-0obja
Thread-1objb
或者两个做一下交换。

t1执行的时候,刚刚进入run的第一个锁a锁。接着想打开第二个锁的时候,第二个锁b锁刚好就被t2给锁上了。

我不能理解的是,对于两个d1,d2来说。他们应该有各自的内存空间。
所以t1,t2根本访问的不是一个地方run();
用地域来表示。
t1锁了北京的车库。结果t2去天津的车库,结果进不去?因为t1把北京的车库给锁了。

难道对于synchronized来说,关键是其里面的obj。
对于整个进程来说,如果用该obja锁定了一段代码。那么就必须在该obja被释放之后,其他的线程才能访问obja锁定的代码。
无论你这些代码是在不同的地方,还是就是同一段代码?


------解决方案--------------------
对了。。 锁的是那个LOCK, 这个和DEMO本身是无关的。