黑马程序员技术交流社区

标题: 线程安全的死锁演示 [打印本页]

作者: fmi110    时间: 2015-9-11 09:20
标题: 线程安全的死锁演示
a
  1. /**
  2. *        死锁演示
  3. */

  4. public class DeadLock implements Runnable {
  5.         private Object objA = new Object();
  6.         private Object objB = new Object();//锁对象
  7.         private boolean flag = false;
  8.        
  9. //        DeadLock(boolean b){
  10. //                this.flag = b;
  11. //        }
  12.         @Override
  13.         public void run() {
  14.                 // 相互嵌套是锁,可能会出现互相等待的现象导致死锁
  15.                 while(true){
  16.                         if(flag){
  17.                                 synchronized(objA){//嵌套锁
  18.                                         System.out.println("if A..."+Thread.currentThread().getName());
  19.                                         synchronized(objB){
  20.                                                 System.out.println("if B..."+Thread.currentThread().getName());
  21.                                         }
  22.                                         flag = flag^true; //flag取反
  23.                                 }
  24.                         }else{
  25.                                 synchronized(objB){//嵌套锁
  26.                                         System.out.println("else A..."+Thread.currentThread().getName());
  27.                                         synchronized(objA){
  28.                                                 System.out.println("else B..."+Thread.currentThread().getName());
  29.                                                                                                                                                                        
  30.                                         }
  31.                                         flag = flag^true;  //flag取反
  32.                                 }
  33.                         }
  34.                 }
  35.                
  36.         }
  37. }
复制代码

  1. public class DeadLockTest {

  2.         /**
  3.          * 用于死锁的测试
  4.          */
  5.         public static void main(String[] args) {
  6.                 // TODO Auto-generated method stub
  7.                 //建立资源对象
  8.                 DeadLock d1 = new DeadLock();
  9.                 //新建两个进程
  10.                 new Thread(d1,"线程1").start();
  11.                 new Thread(d1,"线程2").start();
  12.         }

  13. }
复制代码




作者: fmi110    时间: 2015-9-11 09:29
运行结果
  1. else A...线程1         //线程1 进入else,获取锁B
  2. else B...线程1     
  3. if A...线程1     //线程1执行完else,释放B锁,进入if,获取锁A,在等待获取B锁
  4. else A...线程2        //线程2 持有B锁,在等待A锁
  5. //此时出现互相等待,即死锁现象,程序无法继续运行
复制代码





欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2