Chinaunix首页 | 论坛 | 博客
  • 博客访问: 967281
  • 博文数量: 168
  • 博客积分: 3853
  • 博客等级: 中校
  • 技术积分: 1854
  • 用 户 组: 普通用户
  • 注册时间: 2008-01-15 23:50
文章分类

全部博文(168)

文章存档

2014年(12)

2013年(46)

2012年(60)

2011年(11)

2010年(1)

2009年(17)

2008年(21)

我的朋友

分类: Java

2012-02-15 13:59:45

  1. public class TestDeadLock implements Runnable {
  2.     public int flag = 1; //作用是什么
  3.     static Object o1 = new Object(); //作用是什么

  4.     static Object o2 = new Object(); //作用是什么

  5.     
  6.     public void run() {
  7.     System.out.println("flag=" + flag);
  8.     
  9.     
  10.     
  11.         if(flag == 1) {
  12.             synchronized(o1) {
  13.                 try {
  14.                     Thread.sleep(500);
  15.                 } catch (Exception e) {
  16.                     e.printStackTrace();
  17.                 }
  18.                 synchronized(o2) {
  19.                     System.out.println("1");    
  20.                 }
  21.             }
  22.         }
  23.         
  24.         
  25.         if(flag == 0) {
  26.             synchronized(o2) {
  27.                 try {
  28.                     Thread.sleep(500);
  29.                 } catch (Exception e) {
  30.                     e.printStackTrace();
  31.                 }
  32.                 synchronized(o1) {
  33.                     System.out.println("0");
  34.                 }
  35.             }
  36.         }
  37.     }    
  38.     
  39.     
  40.     public static void main(String[] args) {
  41.         TestDeadLock td1 = new TestDeadLock();
  42.         TestDeadLock td2 = new TestDeadLock();
  43.         td1.flag = 1;
  44.         td2.flag = 0;
  45.         Thread t1 = new Thread(td1);
  46.         Thread t2 = new Thread(td2);
  47.         t1.start();
  48.         t2.start();
  49.         
  50.     }
  51. }


flag常常做为标示用,显然类中也是 这里是为了让一个类,可以调用两种不同的处理过程 死锁的必要条件:
(1) 互斥条件:一个资源每次只能被一个进程使用。
(2) 请求与保持条件:一个进程因请求资源而阻塞时,对已获得的资源保持不放。
(3) 不剥夺条件:进程已获得的资源,在末使用完之前,不能强行剥夺。
(4) 循环等待条件:若干进程之间形成一种头尾相接的循环等待资源关系。

obj1和obj2是模仿2个资源,这个只要是个静态共享对象都可以 一个线程通过synchronized 锁定自己的资源obj1, 并且需要在后面的过程争取第二个资源obj2, 而第二个线程同理锁定自己的obj2, 然后在后面过程争取第一个资源 因为不剥夺条件,不释放自己,又形成循环争取对方资源的环, 从而形成死锁
阅读(822) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~