黑马程序员技术交流社区

标题: 关于死锁的一点想法产生的疑问 [打印本页]

作者: 明月几时有    时间: 2013-11-7 21:01
标题: 关于死锁的一点想法产生的疑问
  1. <p>

  2. class Test implements Runnable
  3. {
  4.         private boolean flag;
  5.         Test(boolean flag)
  6.         {
  7.                 this.flag = flag;
  8.         }

  9.         public void run()
  10.         {
  11.                 if(flag)
  12.                 {
  13.                         while(true)
  14.                         {
  15.                                 synchronized(MyLock.locka)
  16.                                 {
  17.                                         System.out.println(Thread.currentThread().getName()+"...if locka ");
  18.                                         synchronized(MyLock.lockb)
  19.                                         {
  20.                                                 System.out.println(Thread.currentThread().getName()+"..if lockb");                                       
  21.                                         }
  22.                                 }
  23.                         }
  24.                 }
  25.                 else
  26.                 {
  27.                         while(true)
  28.                         {
  29.                                 synchronized(MyLock.lockb)
  30.                                 {
  31.                                         System.out.println(Thread.currentThread().getName()+"..else lockb");
  32.                                         synchronized(MyLock.locka)
  33.                                         {
  34.                                                 System.out.println(Thread.currentThread().getName()+".....else locka");
  35.                                         }
  36.                                 }
  37.                         }
  38.                 }
  39.         }
  40. }


  41. class MyLock
  42. {
  43.         static Object locka = new Object();
  44.         static Object lockb = new Object();
  45. }

  46. class  DeadLockTest
  47. {
  48.         public static void main(String[] args)
  49.         {
  50.                 Thread t1 = new Thread(new Test(true));
  51.                 Thread t2 = new Thread(new Test(false));
  52.                 t1.start();
  53.                 t2.start();
  54.         }
  55. }
  56. 在以上的代码中,有两个锁,MyLock.locka和MyLock.lockb,这两个锁这样交叉使用出现了死锁,为了避免这个情况,在class MyLock中,再创建两个锁  static Object lockc = new Object();    static Object lockd = new Object();然后把这两个锁去替换上面程序中重复的锁,这样不就可以解决死锁了吗,这只是我的一点小小的想法和疑虑,欢迎大神来讨论和指正。</p>
复制代码

作者: 零下五度的水    时间: 2013-11-7 21:34
你以为他们为什么要用一样的锁呢?
加个c,d跟把a,b全扔了效果是一样的,后者效率还高点。。
作者: spiderman    时间: 2013-11-7 23:25
你没有理解锁的本质。。。。。
给你举个例子来理解一下吧。
想象一下:有一个热水器,有两个出水口(A,B),每个口都需要把卡贴在射频识别的模块上才能出水,但是只有一张卡。
你想一下,是不是两个出水口一次只能有一个出水?
如果像你的写法,就相当于两个出水口,都有自己的卡,可以同时出水。
可能例子举的不够形象,给你从代码上说一下吧
synchronized(A对象)           
{
}
这里的对象A,相当于一个钥匙,当一个线程(C)先进入了synchronized代码块,相当于打开了一个门,就会执行代码块里面的内容,那么另一个线程(B),也执行到synchronized代码块时,发现这个钥匙(A)被线程C拿着,他打不开这个门,就会一直等啊,一直等,等到C的同步代码执行完了,把钥匙A交出来了,这时B就能拿钥匙A开B线程这个门了,即可以执行B的同步代码块了。。。。。

说的有点啰嗦,不过,应该能看懂吧?




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