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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

这个代码中如果t1获取了obj锁并且马上又获取了this锁,当t1执行完打印语句时,t1先释放obj锁还是this锁?
  1. /*
  2. 死锁。
  3. 同步中嵌套同步。

  4. */

  5. class Ticket implements Runnable
  6. {
  7.         private  int tick = 1000;
  8.         Object obj = new Object();
  9.         boolean flag = true;
  10.         public  void run()
  11.         {
  12.                 if(flag)
  13.                 {
  14.                         while(true)
  15.                         {
  16.                                 synchronized(obj)
  17.                                 {
  18.                                         show();
  19.                                 }//t1返回这里释放obj锁?
  20.                         }
  21.                 }
  22.                 else
  23.                         while(true)
  24.                                 show();
  25.         }
  26.         public synchronized void show()//this
  27.         {
  28.                 synchronized(obj)
  29.                 {
  30.                         if(tick>0)
  31.                         {
  32.                                 try{Thread.sleep(10);}catch(Exception e){}
  33.                                 System.out.println(Thread.currentThread().getName()+"....code : "+ tick--);
  34.                         }//t1是在这里释放obj锁?
  35.                 }
  36.         }
  37. }


  38. class  DeadLockDemo
  39. {
  40.         public static void main(String[] args)
  41.         {

  42.                 Ticket t = new Ticket();

  43.                 Thread t1 = new Thread(t);
  44.                 Thread t2 = new Thread(t);
  45.                 t1.start();
  46.                 try{Thread.sleep(10);}catch(Exception e){}
  47.                 t.flag = false;
  48.                 t2.start();


  49.         }
  50. }
复制代码

评分

参与人数 1技术分 +1 收起 理由
轻语。 + 1 神马都是浮云

查看全部评分

3 个回复

正序浏览

此方法是被调用的,t1调用的时候t1早就有了obj锁,这个代码块在t1中,代码块执行的时候会获得obj锁,执行完了就释放给t1了,好比家里有车,儿子开出去和爸爸开出去还是放在车库了,车都是咱家的。
回复 使用道具 举报
Yov正 发表于 2014-5-11 11:49
t2可以轻易调用show方法,所以t2可以轻易得到this锁,t1先要得到obj锁才会调用show方法。
所以当t2刚获得th ...
  1. synchronized(obj)
  2.                 {
  3.                         if(tick>0)
  4.                         {
  5.                                 try{Thread.sleep(10);}catch(Exception e){}
  6.                                 System.out.println(Thread.currentThread().getName()+"....code : "+ tick--);
  7.                         }//这个代码块运行完了,为什么不释放obj锁?
  8.                 }
复制代码
回复 使用道具 举报
t2可以轻易调用show方法,所以t2可以轻易得到this锁,t1先要得到obj锁才会调用show方法。
所以当t2刚获得this锁的时候,cpu跳转执行t1获得obj锁,然后t1因为得不到this锁停住了,而t2因为得不到obj锁,show方法也没法执行,死锁了。
对于t1线程来说,是在21行释放锁。当然,线程得到锁以后,当前线程中的代码体可以再次使用该锁,就像是老子传给儿子似的,用完了再还回来呗。

评分

参与人数 1技术分 +1 收起 理由
菜小徐 + 1

查看全部评分

回复 使用道具 举报 0 1
您需要登录后才可以回帖 登录 | 加入黑马