论述题 9.  请写出一段死锁的代码。
【正确答案】死锁是指两个或两个以上的进程在执行过程中,因争夺资源而造成的一种互相等待的现象,若无外力作用,它们都将无法推进下去。
   下面给出一段死锁代码的例子。
   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锁");
   }
   }
   }
   }
【答案解析】