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本身是无关的。