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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

  1. package com.struggle;
  2. /*
  3. * 死锁:同步中嵌套同步,而锁却不同。
  4. */

  5. class Test implements Runnable
  6. {
  7.         private boolean flag;
  8.         //Object obj1 = new Objet();
  9.         //Object obj2 = new Objet();
  10.         Test(boolean flag)
  11.         {
  12.                 this.flag = flag;
  13.         }
  14.         public void run()
  15.         {
  16.                 if(flag)
  17.                 {
  18.                         while(true)
  19.                         {
  20.                                 synchronized(Lock.locka)//锁替换成obj1
  21.                                 {
  22.                                         System.out.println("if locka");
  23.                                         synchronized(Lock.lockb)//锁替换成obj2
  24.                                         {
  25.                                                 System.out.println("if lockb");
  26.                                         }
  27.                                 }
  28.                         }
  29.                 }
  30.                 else
  31.                 {
  32.                         while(true)
  33.                         {
  34.                                 synchronized(Lock.lockb)//锁替换成obj2
  35.                                 {
  36.                                         System.out.println("else lockb");
  37.                                         synchronized(Lock.locka)//锁替换成obj1
  38.                                         {
  39.                                                 System.out.println("else locka");
  40.                                         }
  41.                                 }
  42.                         }
  43.                 }
  44.         }
  45. }
  46. class Lock
  47. {
  48.         static Object locka = new Object();
  49.         static Object lockb = new Object();
  50. }
  51. public class DeadLock {
  52.         public static void main(String args[])
  53.         {
  54.                 Thread t1 = new Thread(new Test(true));
  55.                 Thread t2 = new Thread(new Test(false));
  56.                 t1.start();
  57.                 t2.start();
  58.         }

  59. }
复制代码


如果把synchronized中的对象换成obj1和obj2就锁不起来呢?不也是两个不同的锁吗?求解释

评分

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

查看全部评分

13 个回复

倒序浏览
Thread t1 = new Thread(new Test(true));
Thread t2 = new Thread(new Test(false));
你new出来两个Test对象,因为Ob1,和Obj2在类Test成员位置上,所以你的程序中会有四个Obj对象,
即四个锁,每个线程一直在判断自己的独有的两个锁,锁不起来吧,
应该像上面Lock一样,把两个锁对象单独封装出来:lol

评分

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

查看全部评分

回复 使用道具 举报
大哥,你两个的线程拥有不是同一个资源,应该拥有同一个资源
Thread t1 = new Thread(new Test(true));
Thread t2 = new Thread(new Test(false));

评分

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

查看全部评分

回复 使用道具 举报
zhangyangLengen 发表于 2014-11-15 15:27
大哥,你两个的线程拥有不是同一个资源,应该拥有同一个资源
Thread t1 = new Thread(new Test(true));
Th ...

没听懂                 
回复 使用道具 举报
锁只能有一把,你把创建锁对象的过程放在了Test类里面,每创建一个对象就会有两个所对象,根本不是对应的,如果提取出来放在单独的一个类中,就可以保证只有这两把锁分别取锁他们的对象,这样才能保证线程同步,希望你能理解。

评分

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

查看全部评分

回复 使用道具 举报
一叶障目 发表于 2014-11-15 13:33
Thread t1 = new Thread(new Test(true));
Thread t2 = new Thread(new Test(false));
你new出来两个Test对 ...

好像是那么回事   麻烦再解释一下对于锁设置(对象建立)的要求。这方面有点迷糊
回复 使用道具 举报
我是紫色紫色 发表于 2014-11-15 17:22
锁只能有一把,你把创建锁对象的过程放在了Test类里面,每创建一个对象就会有两个所对象,根本不是对应的, ...

恩 谢谢 好像理解了一部分了,就是两把不同的锁要有关系才行吧,“每创建一个对象就会有两个锁对象”这没理解,创建了一个对象分别有哪两个锁对象呢?
回复 使用道具 举报
没劲睡觉 发表于 2014-11-15 17:26
好像是那么回事   麻烦再解释一下对于锁设置(对象建立)的要求。这方面有点迷糊 ...

锁可以是任意对象,锁就是一个标示,里面有人了,你不能进去,只能人家出来了,你才能进去
回复 使用道具 举报
这问题我在一个帖子中已经回答过了http://bbs.itheima.com/forum.php ... 768&pid=1075606
回复 使用道具 举报
没劲睡觉 发表于 2014-11-15 19:28
恩 谢谢 好像理解了一部分了,就是两把不同的锁要有关系才行吧,“每创建一个对象就会有两个锁对象”这没 ...

因为你每次都new了一个类对象啊,你把锁定义在类里面,new两次就是4个了啊,所以锁只能提取出来单独封装在一个类当中,这样才能保证只有两把锁的存在。
回复 使用道具 举报
兄弟,我觉得你是匿名对象没有搞懂,2楼说的很明白了。。
Thread t1 = new Thread(new Test(true));
new Test()这是一个匿名对象,启动匿名对象之前得先加载Test类把,,而你在Test类中写了下面这两句话
Object obj1 = new Objet();
Object obj2 = new Objet();
意思就是 一个new Test(true)有两把锁 一个 叫obj1  一个叫obj2
Thread t2 = new Thread(new Test(false));
同理 new Test(false)对象 这个家伙也有两把锁,名字也叫一个 叫obj1  一个叫obj2
对应的俩线程 t1
t2 各自有两把名字一样的锁,你说t1访问的时候 能不能锁住t2呢?

评分

参与人数 1黑马币 +2 收起 理由
没劲睡觉 + 2 很给力!

查看全部评分

回复 使用道具 举报
zhangyangLengen 发表于 2014-11-15 15:27
大哥,你两个的线程拥有不是同一个资源,应该拥有同一个资源
Thread t1 = new Thread(new Test(true));
Th ...

匿名对象怎么就不是同一个资源了。。都属于类对象吧。
回复 使用道具 举报
奋斗的蜗牛ksd 发表于 2014-11-17 12:03
兄弟,我觉得你是匿名对象没有搞懂,2楼说的很明白了。。
Thread t1 = new Thread(new Test(true));
new T ...

终于看懂了   理解能力就是这么的高。哈哈
回复 使用道具 举报
没劲睡觉 发表于 2014-11-17 20:10
终于看懂了   理解能力就是这么的高。哈哈

互相进步把 加油!
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马