A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© Kevin.Kang 高级黑马   /  2015-8-5 13:19  /  259 人查看  /  1 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

死锁:
    两个或两个以上的线程在争夺资源的过程中,发生的一种相互等待的现象
例如:
    中国人,外国人吃饭
    正常:
        中国人:筷子两支
        外国人:刀和叉
    死锁:
        中国人:筷子一支,刀一把
        外国人:筷子一支,叉一把
    两个人出现死锁以后,都不能正常用餐,都等着对方
  1. package com.kxg_12;

  2. public class DieLock extends Thread {
  3.         // 创建两个锁对象
  4.         public static Object objA = new Object();
  5.         public static Object objB = new Object();

  6.         // 定义变量
  7.         private boolean flag;

  8.         // 定义构造方法
  9.         public DieLock(boolean flag) {
  10.                 this.flag = flag;
  11.         }

  12.         @Override
  13.         public void run() {
  14.                 if (flag) {
  15.                         // 线程A中嵌套线程B
  16.                         synchronized (objA) {
  17.                                 System.out.println("if ObjA");
  18.                                 synchronized (objB) {
  19.                                         System.out.println("if objB");
  20.                                 }
  21.                         }
  22.                 } else {
  23.                         // 线程B中嵌套线程A
  24.                         synchronized (objB) {
  25.                                 System.out.println("else objB");
  26.                                 synchronized (objA) {
  27.                                         System.out.println("else objA");
  28.                                 }
  29.                         }
  30.                 }
  31.         }
  32. }
复制代码
  1. package com.kxg_12;

  2. public class DieLockDemo {
  3.         public static void main(String[] args) {
  4.                 // 创建两个线程
  5.                 DieLock dl1 = new DieLock(true);
  6.                 DieLock dl2 = new DieLock(false);

  7.                 // 启动线程
  8.                 dl1.start();
  9.                 dl2.start();
  10.         }
  11. }
复制代码



1 个回复

倒序浏览
if中的语句抢到执行权,输入"if objA"。输出"if objB"之前被else中的语句抢到了执行权
else语句输出"else objB",当往下执行的时候需要获取objA锁,但是objA锁在if语句线程中没有释放。
只好等着if语句中释放。此时if语句抢到执行权,往下执行的时候发现需要objB锁,但objB锁在else语句线程中没有释放。
这样就形成了死锁。

回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马