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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 无道 中级黑马   /  2013-12-14 18:56  /  1943 人查看  /  3 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

  1. //死锁同代码中同步函数

  2. package thread;
  3. class LockTwo implements Runnable{
  4.        
  5.         public static boolean falg;
  6.         private static int ticket = 100;
  7.        
  8.         LockTwo(boolean falg)        {
  9.                
  10.                 this.falg = falg;       
  11.         }
  12.        
  13.         public void run(){
  14.                
  15.                 if(falg){
  16.                         while(true)
  17.                         synchronized(LockTwo.class){
  18.                                
  19.                                 show();       
  20.                         }       
  21.                 }
  22.                 else{
  23.                         while(true)
  24.                                 show();
  25.                 }
  26.                                
  27.         }
  28.         private synchronized void show(){
  29.                
  30.                 synchronized(LockTwo.class){
  31.                        
  32.                         System.out.println(Thread.currentThread().getName()+"----------------"+ticket--);       
  33.                 }       
  34.         }
  35. }

  36. public class DeathLockTwo{
  37.        
  38.         public static void main(String[] args){
  39.                
  40.                 LockTwo lock = new LockTwo(false);       
  41.                 new Thread(lock).start();
  42.                 lock.falg = true;
  43.                 new Thread(lock).start();
  44.         }       
  45. }
复制代码

此程序为什么构不成死锁呢?请高手解答。谢谢。

评分

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

查看全部评分

3 个回复

倒序浏览

厕所A里有张三,这个时候李四要去厕所A的话,就必须等张三出来
而李四去厕所B跟张三无关,要看厕所B里是谁持有所有权,这是我对锁的理解。
死锁就是A锁持有B锁,B锁持有A锁,两个相持不下,谁也释放布料锁,谁也访问不了锁。你写的没错。
不过你这个就一个对象啊,lock.falg = true;
还是就一个lock对象也就是说除了主线程就一个线程啊哥们,你在建个线程就成死锁了。。。

评分

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

查看全部评分

回复 使用道具 举报
你这个代码是因为第一个子线程还没有起来,主线程已经将flag设为true了。
你可以再if和else里面分别加一句打印试试看,会输出两个if子句里的值。
想要形成死锁可以在main函数里lock.flag=true之前加一句sleep。
  1. public class TestDeadlockTwo{      
  2.       public static void main(String[] args){
  3.               
  4.               LockTwo lock = new LockTwo(false);        
  5.               new Thread(lock).start();
  6.               try {
  7.                                 Thread.sleep(1000);
  8.                         } catch (InterruptedException e) {
  9.                                 // TODO Auto-generated catch block
  10.                                 e.printStackTrace();
  11.                         }
  12.               lock.falg = true;
  13.               new Thread(lock).start();
  14.       }        
  15. }
复制代码

评分

参与人数 1技术分 +1 收起 理由
FFF + 1 淡定

查看全部评分

回复 使用道具 举报
Lillian 发表于 2013-12-14 22:46
你这个代码是因为第一个子线程还没有起来,主线程已经将flag设为true了。
你可以再if和else里面分别加一句 ...

非常感谢您的回答。问题果然是出要此处。
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马