黑马程序员技术交流社区

标题: 此程序为什么构不成死锁? [打印本页]

作者: 无道    时间: 2013-12-14 18:56
标题: 此程序为什么构不成死锁?
  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. }
复制代码

此程序为什么构不成死锁呢?请高手解答。谢谢。
作者: 王雨神    时间: 2013-12-14 21:38

厕所A里有张三,这个时候李四要去厕所A的话,就必须等张三出来
而李四去厕所B跟张三无关,要看厕所B里是谁持有所有权,这是我对锁的理解。
死锁就是A锁持有B锁,B锁持有A锁,两个相持不下,谁也释放布料锁,谁也访问不了锁。你写的没错。
不过你这个就一个对象啊,lock.falg = true;
还是就一个lock对象也就是说除了主线程就一个线程啊哥们,你在建个线程就成死锁了。。。
作者: Lillian    时间: 2013-12-14 22:46
你这个代码是因为第一个子线程还没有起来,主线程已经将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. }
复制代码

作者: 无道    时间: 2013-12-15 22:04
Lillian 发表于 2013-12-14 22:46
你这个代码是因为第一个子线程还没有起来,主线程已经将flag设为true了。
你可以再if和else里面分别加一句 ...

非常感谢您的回答。问题果然是出要此处。




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