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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

  1. <p>class LockTest implements Runnable
  2. {
  3. private boolean flag;
  4. LockTest(boolean flag)
  5. {
  6.   this.flag=flag;
  7. }
  8. public void run()
  9. {
  10.   if(flag)
  11.   {
  12.    while(true)
  13.    {
  14.     synchronized(LockClass.locka)
  15.     {
  16.      System.out.println(Thread.currentThread().getName()+"---if_locka");
  17.     }
  18.     synchronized(LockClass.lockb)
  19.     {
  20.      System.out.println(Thread.currentThread().getName()+"----if_lockb");
  21.     }
  22.    
  23.    }
  24.   }
  25.   else
  26.   {
  27.    while(true)
  28.    {
  29.     synchronized(LockClass.lockb)
  30.     {
  31.      System.out.println(Thread.currentThread().getName()+"----else_lockb");
  32.     }
  33.     synchronized(LockClass.locka)
  34.     {
  35.      System.out.println(Thread.currentThread().getName()+"---else_locka");
  36.     }
  37.    }
  38.   }
  39. }
  40. }
  41. class LockClass
  42. {
  43. static Object locka = new Object();
  44. static Object lockb = new Object();
  45. }</p><p>class DeadLock
  46. {
  47. public static void main(String[] args)
  48. {
  49.   new Thread(new LockTest(true)).start();
  50.   new Thread(new LockTest(false)).start();
  51. }
  52. }
  53. <img border="0" alt="" src="http://bbs.itheima.com/forum.php?mod=image&aid=62462&size=300x300&key=485d320d39dce60f&nocache=yes&type=fixnone" aid="attachimg_62462"></p><p> </p>
复制代码
来大神帮我看看这算是死锁吗??为什么我运行的是无限循环啊,到底哪里出错了。

QQ图片20150102162322.jpg (80.32 KB, 下载次数: 2)

QQ图片20150102162322.jpg

6 个回复

正序浏览
楼上回答的对。两个锁需要嵌套相互依赖才会产生死锁。你代码中两个锁是独立的,拿到锁A,释放完锁A再去拿锁B。这样当然不会产生死锁。

死锁原理:你拿到的锁资源A,要等到拿到锁资源B 才会释放锁资源A,否则不放。所以嵌套就可以模拟出死锁了。

  1. while(true)
  2.                         {
  3.                                 synchronized(LockClass.lockb)
  4.                                 {
  5.                                         System.out.println(Thread.currentThread().getName()+"----else_lockb");
  6.                                 
  7.                                     synchronized(LockClass.locka)
  8.                                     {
  9.                                             System.out.println(Thread.currentThread().getName()+"---else_locka");
  10.                                     }
  11.                                 }
  12.                         }
复制代码
回复 使用道具 举报
李天富 发表于 2015-1-6 16:14
你这肯定没死锁啊,要锁嵌套才可以。改成这样试试:synchronized(LockClass.locka)
        {
                System.out.printl ...

谢谢大神   我去试试
回复 使用道具 举报
你这肯定没死锁啊,要锁嵌套才可以。改成这样试试:synchronized(LockClass.locka)
        {
                System.out.println(Thread.currentThread().getName()+"---if_locka");
                synchronized(LockClass.lockb)
                {
                 System.out.println(Thread.currentThread().getName()+"----if_lockb");
                }
        }


回复 使用道具 举报
竟然没人理睬我
回复 使用道具 举报
class LockTest implements Runnable
{
        private boolean flag;
        LockTest(boolean flag)
        {
                this.flag=flag;
        }
        public void run()
        {
                if(flag)
                {
                        while(true)
                        {
                                synchronized(LockClass.locka)
                                {
                                        System.out.println(Thread.currentThread().getName()+"---if_locka");
                                }
                                synchronized(LockClass.lockb)
                                {
                                        System.out.println(Thread.currentThread().getName()+"----if_lockb");
                                }       
                               
                        }
                }
                else
                {
                        while(true)
                        {
                                synchronized(LockClass.lockb)
                                {
                                        System.out.println(Thread.currentThread().getName()+"----else_lockb");
                                }
                                synchronized(LockClass.locka)
                                {
                                        System.out.println(Thread.currentThread().getName()+"---else_locka");
                                }
                        }
                }
        }
}
class LockClass
{
        static Object locka = new Object();
        static Object lockb = new Object();
}

class DeadLock
{
        public static void main(String[] args)
        {
                new Thread(new LockTest(true)).start();
                new Thread(new LockTest(false)).start();
        }
}
再传一遍得了
回复 使用道具 举报
53行以下的什么都没有啊    穿的时候出现的   不知道怎么回事
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马