把程序运行过程简单分析一下就知道了:
首先t1启动,获得resource1,然后sleep(1000),
t2启动,获得resource2,然后sleep(1000)
t1的sleep结束后,放弃了对resource1的占用,然后再申请resource2(问题就在这里)
t2的sleep结束后,放弃了对resource2的占用,申请resource1(此时t1已经释放了resource1),申请成功
而后t1申请resource2也可以申请成功了
所以不会出现死锁我把程序部分代码移了个位就会死锁了:
class DeadLock {
public static void main(String[] args)
{
final Object resource1 = "resource1";
final Object resource2 = "resource2";
Thread t1 = new Thread() {
public void run() {
synchronized(resource1) {
System.out.println("Thread1 pocess the resource1");
try {
Thread.sleep (1000);
} catch(InterruptedException e) {
}
synchronized(resource2) {
System.out.println("Thread1 pocess the resource2");
}
}
}
};
Thread t2 = new Thread() {
public void run() {
synchronized(resource2) {
System.out.println("Thread2 pocess the resource2");
try {
Thread.sleep (1000);
} catch(InterruptedException e) {
}
synchronized(resource1) {
System.out.println("Thread2 pocess the resource1");
}
}
}
};
t1.start ();
t2.start ();
}
}
首先t1启动,获得resource1,然后sleep(1000),
t2启动,获得resource2,然后sleep(1000)
t1的sleep结束后,放弃了对resource1的占用,然后再申请resource2(问题就在这里)
t2的sleep结束后,放弃了对resource2的占用,申请resource1(此时t1已经释放了resource1),申请成功
而后t1申请resource2也可以申请成功了
所以不会出现死锁我把程序部分代码移了个位就会死锁了:
class DeadLock {
public static void main(String[] args)
{
final Object resource1 = "resource1";
final Object resource2 = "resource2";
Thread t1 = new Thread() {
public void run() {
synchronized(resource1) {
System.out.println("Thread1 pocess the resource1");
try {
Thread.sleep (1000);
} catch(InterruptedException e) {
}
synchronized(resource2) {
System.out.println("Thread1 pocess the resource2");
}
}
}
};
Thread t2 = new Thread() {
public void run() {
synchronized(resource2) {
System.out.println("Thread2 pocess the resource2");
try {
Thread.sleep (1000);
} catch(InterruptedException e) {
}
synchronized(resource1) {
System.out.println("Thread2 pocess the resource1");
}
}
}
};
t1.start ();
t2.start ();
}
}
解决方案 »
免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货