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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© Solomon 高级黑马   /  2014-6-9 17:45  /  1111 人查看  /  6 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

   锁1{  锁2{ }   }

   锁2{  锁1{ }   }

6 个回复

倒序浏览
同步内嵌套同步就会产生死锁的情况
回复 使用道具 举报
差不多,但并不是一定会出现死锁,加个while(true)的话就一定会出现死锁了。。
回复 使用道具 举报

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

  47. }

  48. class DeadLockTest
  49. {
  50.    public static void main(String[] args)
  51.    {
  52.    
  53.    
  54.    Test a = new Test(true);
  55.    Test b = new Test(false);
  56.    Thread t1 = new Thread(a);
  57.     Thread t2 = new Thread(b);
  58.         t1.start();
  59.         t2.start();
  60.    
  61.    
  62.    }

  63. }
复制代码


代码如上,如果仅仅是嵌套有时候锁不上,需要加上while(true),就一定能锁上了,这个算是比较简单的锁了!

评分

参与人数 1技术分 +1 收起 理由
SyouRai_Tsk + 1

查看全部评分

回复 使用道具 举报
产生死锁的原因主要有:
1、临界资源使用的互斥性
一个资源每次只能给一个进程使用
2、部分地分配资源.  
一个进程在申请新的资源的同时保持对原有资源的占有(只有这样才是动态申请,动态分配)
3、资源的循环等待.
存在一个进程等待队列 {P1 , P2 , … , Pn},其中P1等待P2占有的资源,P2等待P3占有的资源…Pn等待P1占有的资源,形成一个进程等待环路
4、资源的不可抢占性等.
资源申请者不能强行的从资源占有者手中夺取资源,资源只能由占有者自愿释放

说是原因,也可以称为前提... 4条都满足才会发生死锁
回复 使用道具 举报
看了楼上的解释我也明白了
回复 使用道具 举报
感谢楼上解析,受教了哈
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马