【正确答案】死锁是指两个或两个以上的进程在执行过程中,因争夺资源而造成的一种互相等待的现象,若无外力作用,它们都将无法推进下去。
下面给出一段死锁代码的例子。
class ShareObject1{}
class ShareObject2{)
class Thread 1 extends Thread{
@Override
publicvoid run(){
synchronized(ShareObject1.class){
System.out.println("线程1获取到ShareObject1锁");
try{
Thread.sleep(100);
}catch(InterruptedException e){
e.printStackTrace();
}
synchronized(ShareObject2.class){
System.out.println("线程1获取到ShareObject2锁");
}
}
}
}
class Thread2 extends Thread{
public void run(){
synchronized(ShareObject2.class){
try{
Thread.sleep(100);
}catch(InterruptedException e){
e.printStackTrace();
}
System.out.println("线程2获取到ShareObject2锁");
synchronized(ShareObject1.class){
System.out.println("线程2获取到ShareObject1锁");
}
}
}
}
public class Test{
public static void main(String[]args){
new Thread1().start();
new Thread2().start();
}
}
在上述代码中,线程Thread1首先获取到Shareobject1的锁,然后再去尝试获取ShareObject2的锁;此时线程Thread2已经获取到ShareObject2的锁,继续尝试去获取ShareObject1的锁。这样两个线程都需要得到对方已经占有的资源后才能继续运行,因此,会导致死锁。造成死锁的主要原因是两个线程请求资源的顺序不合理,如果这两个线程采用同样的顺序获取,那么就不会出现死锁,例如把Thread2改为如下的代码就不会死锁了:
class Thread2 extends Thread {
public void run(){
synchronized(ShareObject1.class){
System.out.println("线程2获取到ShareObject1锁");
try{
Thread.sleep(100);
}catch(InterruptedException e){
e.printStackTrace();
}
synchronized(ShareObject2.class){
System.out.println("线程2获取到ShareObject2锁");
}
}
}
}
【答案解析】