黑马程序员技术交流社区

标题: 关于一个死锁程序运行的问题 [打印本页]

作者: 不去会死    时间: 2014-6-21 16:00
标题: 关于一个死锁程序运行的问题
本帖最后由 不去会死 于 2014-6-25 22:36 编辑
  1. public class ThreadDieSock implements Runnable {
  2.     private int flag = 1;
  3.     private Object obj1 = new Object(), obj2 = new Object();

  4.     public void run() {
  5.         System.out.println("flag=" + flag);
  6.         if (flag == 1) {
  7.             synchronized (obj1) {
  8.                 System.out.println("我已经锁定obj1,休息0.5秒后锁定obj2去!");
  9.                 try {
  10.                     Thread.sleep(500);
  11.                 } catch (InterruptedException e) {
  12.                     e.printStackTrace();
  13.                 }
  14.                 synchronized (obj2) {
  15.                     System.out.println("1");
  16.                 }
  17.             }
  18.         }
  19.         if (flag == 0) {
  20.             synchronized (obj2) {
  21.                 System.out.println("我已经锁定obj2,休息0.5秒后锁定obj1去!");
  22.                 try {
  23.                     Thread.sleep(500);
  24.                 } catch (InterruptedException e) {
  25.                     e.printStackTrace();
  26.                 }
  27.                 synchronized (obj1) {
  28.                     System.out.println("0");
  29.                 }
  30.             }
  31.         }
  32.     }

  33.     public static void main(String[] args) {
  34.         ThreadDieSock run01 = new ThreadDieSock();
  35.         ThreadDieSock run02 = new ThreadDieSock();
  36.         run01.flag = 1;
  37.         run02.flag = 0;
  38.         Thread thread01 = new Thread(run01);
  39.         Thread thread02 = new Thread(run02);
  40.         System.out.println("线程开始喽!");
  41.         thread01.start();
  42.         thread02.start();
  43.     }
  44. }
复制代码
运行结果:
线程开始喽!
flag=0
flag=1
我已经锁定obj2,休息0.5秒后锁定obj1去!
我已经锁定obj1,休息0.5秒后锁定obj2去!
0
1

我的问题是,0 与 1 不是应该不会被打印的吗?有点懵了



作者: 崔湖尧    时间: 2014-6-21 16:30
1. 兄弟,你这里run01和run02是两个独立的对象,分别在各自的线程中运行,也就是各自只有一个线程在运行;
2. 这样开启多线程:Thread thread01 = new Thread(run01);
                                     Thread thread02 = new Thread(run01);
                                     thread01.start();
                                     thread02.start();
作者: 姿_`态    时间: 2014-6-21 18:58
楼上说的对,你要用两个线程去操作同一个对象才会产生死锁。下面是我修改代码,一个是object 锁,一个是this锁,其实你没必要
创建两个对象作为锁,程序没有优化,楼主看看。

public class ThreadDieSock implements Runnable {
    private int flag=1;
    private Object obj = new Object();

    public void run() {
        System.out.println("flag=" + flag);
        if (flag==1) {
            synchronized (this) {
                System.out.println("我已经锁定obj1,休息0.5秒后锁定obj2去!");
                                this.flag=0;
                try {
                    Thread.sleep(500);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                synchronized (obj) {
                    System.out.println("1");
                }
            }
        }
        if (flag==0) {
            synchronized (obj) {
                System.out.println("我已经锁定obj2,休息0.5秒后锁定obj1去!");
                                this.flag=1;
                try {
                    Thread.sleep(500);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                synchronized (this) {
                    System.out.println("0");
                }
            }
        }
    }

    public static void main(String[] args) {
        ThreadDieSock run01 = new ThreadDieSock();
        Thread thread01 = new Thread(run01);
        Thread thread02 = new Thread(run01);
        System.out.println("线程开始喽!");
        thread01.start();
        thread02.start();
    }
}






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