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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© Mr.高 中级黑马   /  2014-6-23 20:40  /  732 人查看  /  1 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文


  1. class Maipiao implements  Runnable
  2. {
  3.         private int piao=100;
  4.         
  5.         public /*synchronized*/  void run()
  6.         {
  7.                         
  8.                         
  9.                 Object a=new Object();
  10.         
  11.                
  12.                         while(true)
  13.                 {
  14.                                 synchronized(a)
  15.                                 
  16.                                 {        if(piao>0)
  17.                                         {
  18.                                         try{Thread.sleep(10);}catch (InterruptedException e){}
  19.                                        
  20.                                                 System.out.println(Thread.currentThread().getName()+"piao="+piao--);
  21.                
  22.                                         }
  23.                                 }
  24.                         
  25.                 }
  26.         }        
  27. }


  28. class  Demo
  29. {
  30.         public static void main(String[] args)
  31.         {
  32.                 Maipiao a=new Maipiao();
  33.                 Thread b=new Thread (a);
  34.                 Thread c=new Thread (a);
  35.                 Thread d=new Thread (a);
  36.                 Thread e=new Thread (a);
  37.                 b.start();
  38.                 c.start();
  39.                 d.start();
  40.                 e.start();
  41.                 System.out.println("Hello World!");
  42.         }
  43. }
复制代码

大家看一下,结果运行出来怎么还有0,-1,如果改成同步函数就没有这个问题。大家看一下

1 个回复

正序浏览
Object a=new Object();   
是锁的问题!你在run方法内定义锁,则实际上生成的几个Thread对象内的run方法内的锁都不是同一个,如果要保证同步,锁对象必须是同一个。把 Object a=new Object();    写到run方法外就可以了!
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马