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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 奋斗的小胖子 中级黑马   /  2014-2-11 19:52  /  1027 人查看  /  4 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 奋斗的小胖子 于 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. }
复制代码

评分

参与人数 1技术分 +1 收起 理由
何伟超 + 1

查看全部评分

4 个回复

倒序浏览
大哥,run表示调用函数,start表示启动一个线程调用函数,现在明白了吗

评分

参与人数 1技术分 +1 收起 理由
何伟超 + 1 看来你学得不错!!

查看全部评分

回复 使用道具 举报
何苦似梦离 发表于 2014-2-11 19:58
大哥,run表示调用函数,start表示启动一个线程调用函数,现在明白了吗

就这么简单?

点评

不然你以为呢  发表于 2014-2-11 21:01
回复 使用道具 举报
你可以查API,看Thread类中这两个方法的具体说明
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马