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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© s476596497 中级黑马   /  2014-1-11 14:41  /  955 人查看  /  2 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

大家帮忙看看,为什么我的代码运行起来一直都是和谐的  没有发生死锁,是不是代码有问题?


package test;

public class TestSynchronized implements Runnable{

        Object a = new Object();
        //Object b = new Object();
        private boolean flag ;
        TestSynchronized(boolean flag){
                this.flag = flag;
        }
        @Override
        public void run() {
                // TODO Auto-generated method stub
                if(flag)
                {
                        while(true){
                        synchronized(a){
                                try {
                                        Thread.sleep(100);
                                } catch (InterruptedException e) {
                                        // TODO Auto-generated catch block
                                        e.printStackTrace();
                                }
                                System.out.println("if run a");
                                synchronized(this){
                                        System.out.println("if run b");
                                }
                        }
                }
        }
                else{
                        while(true){
                        synchronized(this){
                                try {
                                        Thread.sleep(100);
                                } catch (InterruptedException e) {
                                        // TODO Auto-generated catch block
                                        e.printStackTrace();
                                }
                                System.out.println("else run b");
                                synchronized(a){
                                        System.out.println("else run a");
                                }
                        }
                }
        }
        }
}


package test;

public class TestSynchronizedDemo {

        /**
         * @param args
         */
        public static void main(String[] args) {
                // TODO Auto-generated method stub
               
                Thread t1 = new Thread(new TestSynchronized(true));
                Thread t2 = new Thread(new TestSynchronized(false));
                t1.start();
                t2.start();
        }

}

评分

参与人数 1技术分 +1 收起 理由
ily521125 + 1 淡定

查看全部评分

2 个回复

倒序浏览
感觉对锁理解的也是一般,但是还能看出你这代码里面没有定义锁。你的a锁和b锁是怎么来的,我也没有想明白。我把代码调通了,你参考一下吧。另外死锁两把钥匙开两个房门是同时进行的,所以运行的结果是随机的。
  1. package deadLock;
  2. class TestSynchronized  implements Runnable{

  3.         Object a = new Object();
  4.         //Object b = new Object();
  5.         private boolean flag ;
  6.         TestSynchronized (boolean flag){
  7.                 this.flag = flag;
  8.         }
  9.         @Override
  10.         public void run() {
  11.                 if(flag)
  12.                 {
  13.                     while(true){
  14.                             //拿着a钥匙去开a门进到了a的房间
  15.                             synchronized(Mylock.a){
  16.                             try {
  17.                                     Thread.sleep(10);
  18.                             } catch (InterruptedException e) {
  19.                                     e.printStackTrace();
  20.                             }
  21.                                     System.out.println("if run a");
  22.                                     //a房间里面还有一个房间,需要用b钥匙去开,但是a在拿a钥匙开a房门的同时,b已经把b钥匙拿走了,所以a在这个位置被锁死了。
  23.                             synchronized(Mylock.b){
  24.                             System.out.println("if run b");
  25.                             }
  26.                             }
  27.                 }
  28.         }
  29.                 else{
  30.                     while(true){
  31.                             //在这b被锁死的原理跟上面一样
  32.                             synchronized(Mylock.b){
  33.                                     try {
  34.                                             Thread.sleep(10);
  35.                                     } catch (InterruptedException e) {
  36.                                             e.printStackTrace();
  37.                                     }
  38.                                     System.out.println("else run b");
  39.                                     synchronized(Mylock.a){
  40.                                             System.out.println("else run a");
  41.                                     }
  42.                             }
  43.                 }
  44.         }
  45.         }
  46. }
  47. //定义两把锁
  48. class Mylock
  49. {
  50.         public static Object a = new Object();
  51.         public static Object b = new Object();
  52. }
  53. public class Lock {

  54.         /**
  55.          * @param args
  56.          */
  57.         public static void main(String[] args) {
  58.                 // TODO Auto-generated method stub
  59.                
  60.                 Thread t1 = new Thread(new TestSynchronized (true));
  61.                 Thread t2 = new Thread(new TestSynchronized (false));
  62.                 t1.start();
  63.                 t2.start();
  64.         }

  65. }
复制代码

评分

参与人数 1技术分 +1 收起 理由
ily521125 + 1 赞一个!

查看全部评分

回复 使用道具 举报
毕老师说的两个前提!!!!你看看你用的是不是同一个锁?你这里this对应两个不同的对象,a也对应两个不同的对象,把a搞成static的,然后再搞多一个b也是static的,或者写一个类,里面有两把锁,这样也可以

评分

参与人数 1技术分 +1 收起 理由
ily521125 + 1 赞一个!

查看全部评分

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