java线程:一个死锁的小程序


死锁是这样一种情形:多个线程同时被阻塞,它们中的一个或者全部都在等待某个资源被释放。由于线程被无限期地阻塞,因此程序不可能正常终止。

 

  导致死锁的根源在于不适当地运用synchronized关键词来管理线程对特定对象的访问。synchronized关键词的作用是,确保在某个时刻只有一个线程被允许执行特定的代码块,因此,被允许执行的线程首先必须拥有对变量或对象的排他性的访问权。当线程访问对象时,线程会给对象加锁,而这个锁导致其它也想访问同一对象的线程被阻塞,直至第一个线程释放它加在对象上的锁。

  由于这个原因,在使用synchronized关键词时,很容易出现两个线程互相等待对方做出某个动作的情形。代码一是一个导致死锁的简单例子。

分类: java_线程  34人阅读 评论(0) 收藏 举报
[java] view plaincopy
  1. <span style="font-family:Arial;">  
  2. /** 
  3.  * 演示死锁的一个小程序 
  4.  * @author amber2012 
  5.  * 
  6.  */  
  7. public class DeadLock {  
  8.       
  9.     private Object obj_1 = new Object();  
  10.     private Object obj_2 = new Object();  
  11.       
  12.     public static void main(String[] args) {  
  13.           
  14.         final DeadLock deadLock = new DeadLock();  
  15.           
  16.         // 第一个线程  
  17.         new Thread(new Runnable(){  
  18.             public void run() {  
  19.                 try {  
  20.                     deadLock.method_1();  
  21.                 } catch (InterruptedException e) {  
  22.                     throw new RuntimeException(e);  
  23.                 }  
  24.             }  
  25.         }).start();  
  26.           
  27.         // 第二个线程  
  28.         new Thread(new Runnable(){  
  29.             public void run() {  
  30.                 try {  
  31.                     deadLock.method_2();  
  32.                 } catch (InterruptedException e) {  
  33.                     throw new RuntimeException(e);  
  34.                 }  
  35.             }  
  36.         }).start();  
  37.           
  38.     }  
  39.       
  40.     public void method_1() throws InterruptedException{  
  41.         synchronized (obj_1) {  
  42.             Thread.sleep(1000); // 当前线程睡一会,让另外一个线程保证能得到obj_2的执行权  
  43.             synchronized (obj_2) {  
  44.                 System.out.println("DeadLock.method_1()");  
  45.             }  
  46.         }  
  47.     }  
  48.       
  49.     public void method_2() throws InterruptedException{  
  50.         synchronized (obj_2) {  
  51.             Thread.sleep(1000); // 当前线程睡一会,让另外一个线程保证能得到obj_1的执行权  
  52.             synchronized (obj_1) {  
  53.                 System.out.println("DeadLock.method_2()");  
  54.             }  
  55.         }  
  56.     }  
  57. }  
  58. </span>  

猜你喜欢

转载自rainyear.iteye.com/blog/1716886