黑马程序员技术交流社区

标题: 死锁问题 [打印本页]

作者: 奋斗的小胖子    时间: 2014-2-11 19:52
标题: 死锁问题
本帖最后由 奋斗的小胖子 于 2014-2-11 20:26 编辑

我自己写了个死锁代码,发现线程调用的时候用run锁不上,用start才锁得什么?怎么回事?
  1. /*建立一个死锁范例
  2. * 需求分析:1,首先要有多个线程
  3. *                         2,应该有两个方法,分别互相嵌套加锁
  4. *                         3,建立两把锁               
  5. * */
  6. class  synchronizedDemo
  7. {
  8.         public static void main(String[] args)
  9.         {
  10.                 DeadDemo d1=new DeadDemo(true);
  11.                 DeadDemo d2=new DeadDemo(false);
  12.                 Thread t1=new Thread(d1);
  13.                 Thread t2=new Thread(d2);
  14. //                t1.start();
  15. //                t2.start();
  16.                 t1.run();
  17.                 t2.run();
  18.         }
  19. }

  20. class DeadDemo  implements Runnable
  21. {
  22.         //这里的flag要确保两个线程走不同的方法
  23.         private boolean flag;
  24.         //这里输入的不同值将确保线程访问不同的方法
  25.         DeadDemo(boolean flag)
  26.         {
  27.                 this.flag=flag;
  28.         }
  29.         @Override
  30.         public void run()
  31.         {
  32.                 while(true)
  33.                 {
  34.                         if(flag==true)
  35.                         {
  36.                                 synchronized (Lock.lockA)
  37.                                 {
  38.                                         System.out.println("if------lockA");
  39.                                         synchronized (Lock.lockB)
  40.                                         {
  41.                                                 System.out.println("if------lockB");
  42.                                         }
  43.                                        
  44.                                 }
  45.                         }
  46.                         else
  47.                         {
  48.                                 synchronized (Lock.lockB)
  49.                                 {
  50.                                         System.out.println("else------lockB");
  51.                                         synchronized (Lock.lockA)
  52.                                         {
  53.                                                 System.out.println("else------lockA");
  54.                                         }
  55.                                 }
  56.                         }
  57.                 }
  58.         }

  59.         
  60. }
  61. //建立两把锁
  62. class Lock
  63. {
  64.         public static  Lock  lockA=new Lock();
  65.         public static  Lock  lockB=new Lock();
  66. }
复制代码


作者: 何苦似梦离    时间: 2014-2-11 19:58
大哥,run表示调用函数,start表示启动一个线程调用函数,现在明白了吗
作者: 奋斗的小胖子    时间: 2014-2-11 20:18
何苦似梦离 发表于 2014-2-11 19:58
大哥,run表示调用函数,start表示启动一个线程调用函数,现在明白了吗

就这么简单?
作者: 程澄    时间: 2014-2-11 20:23
你可以查API,看Thread类中这两个方法的具体说明




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