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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 不去会死 中级黑马   /  2014-6-21 16:00  /  1349 人查看  /  2 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 不去会死 于 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 不是应该不会被打印的吗?有点懵了


评分

参与人数 1技术分 +1 收起 理由
李小然 + 1

查看全部评分

2 个回复

倒序浏览
1. 兄弟,你这里run01和run02是两个独立的对象,分别在各自的线程中运行,也就是各自只有一个线程在运行;
2. 这样开启多线程:Thread thread01 = new Thread(run01);
                                     Thread thread02 = new Thread(run01);
                                     thread01.start();
                                     thread02.start();

评分

参与人数 1技术分 +1 收起 理由
李小然 + 1

查看全部评分

回复 使用道具 举报
楼上说的对,你要用两个线程去操作同一个对象才会产生死锁。下面是我修改代码,一个是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();
    }
}

评分

参与人数 1技术分 +1 收起 理由
李小然 + 1

查看全部评分

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