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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© Dream. 中级黑马   /  2014-10-22 21:08  /  1002 人查看  /  7 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

为何我打的死锁 ,如果按照现在的方式重复测试很多次没有出现和谐现象,但是如果把锁换成注释掉的a,b的话一直是和谐没有出现死锁现象???

  1. class Tes implements Runnable
  2. {
  3.         private boolean flag;
  4.         //Object a = new Object();
  5.         //Object b = new Object();
  6.         Tes(boolean flag)
  7.         {
  8.                 this.flag = flag;
  9.         }
  10.         public void run()
  11.         {
  12.                 if(flag)
  13.                 {
  14.                         while(true)
  15.                         {
  16.                                 synchronized(MyLock.locka)
  17.                                 {
  18.                                         System.out.println("if a");
  19.                                         synchronized(MyLock.lockb)
  20.                                         {
  21.                                                 System.out.println("if b");
  22.                                         }
  23.                                 }
  24.                         }
  25.                 }
  26.                 else
  27.                 {
  28.                         while(true)
  29.                         {
  30.                                 synchronized(MyLock.lockb)
  31.                                 {
  32.                                        
  33.                                         System.out.println("else b");
  34.                                         synchronized(MyLock.locka)
  35.                                         {
  36.                                                 System.out.println("else a");
  37.                                         }
  38.                                 }
  39.                         }
  40.                 }
  41.         }

  42. }

  43. class MyLock
  44. {
  45.         static Object locka = new Object();
  46.         static Object lockb = new Object();
  47. }
  48. class Test
  49. {
  50.         public static void main(String[] args)
  51.         {
  52.                
  53.                 Thread t1 = new Thread(new Tes(true));
  54.                 Thread t2 = new Thread(new Tes(false));
  55.                 t1.start();       
  56.                 t2.start();

  57.         }
  58. }
复制代码

评分

参与人数 1技术分 +1 收起 理由
杨佳名 + 1 加油!

查看全部评分

7 个回复

倒序浏览
如果换成a和b的对象会出现无限循环 一直没有死锁请问是什么情况???
回复 使用道具 举报
求解阿  有大神么
回复 使用道具 举报
Thread t1 = new Thread(new Tes(true));
Thread t2 = new Thread(new Tes(false));
产生死锁必须synchronized(某一个对象),但是你new Test()两次,a和b并不是同一个对象中的啊。你给线程上了锁,但是两个线程不是同一把锁。如果你把a,b改成static就会出现死锁了。

评分

参与人数 1技术分 +1 收起 理由
杨佳名 + 1

查看全部评分

回复 使用道具 举报
会飞的蜗牛 发表于 2014-10-22 21:37
Thread t1 = new Thread(new Tes(true));
Thread t2 = new Thread(new Tes(false));
产生死锁必须synchroni ...

必须静态才会出现死锁么 原理是什么啊
回复 使用道具 举报
会飞的蜗牛 发表于 2014-10-22 21:37
Thread t1 = new Thread(new Tes(true));
Thread t2 = new Thread(new Tes(false));
产生死锁必须synchroni ...

我明白了。。。  t1的a和t2的a根本不是一个对象  之前试过this 和类名.class 同样是this代表两个对象吧  谢谢了哈
回复 使用道具 举报
Chopper 中级黑马 2014-10-23 15:01:51
7#
那样一个是一个锁是t1.a和t1.b,另一个是t2.a和t2.b ,锁不一样自然就不会出现死锁的情况
回复 使用道具 举报
zd12345 中级黑马 2014-10-24 09:58:01
8#
两个锁不一样吧!
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马