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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 苑桥别馆 中级黑马   /  2014-12-4 22:37  /  1501 人查看  /  7 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

  1. <p>class Runs implements Runnable//实现接口
  2. {
  3.         private int i=10;
  4.         public void run(){//复写run()方法
  5.                 boolean flag=true;
  6.                         while(flag){
  7.                                 synchronized(new Object()){//同步代码块
  8.                                 if(i>0){
  9.                                         try{Thread.sleep(10);}
  10.                                                 catch(Exception e){}
  11.                                         System.out.println(Thread.currentThread().getName()+"--"+i--);
  12.                                 }else
  13.                                         flag=false;
  14.                         }
  15.         }
  16. }
  17.                
  18. };
  19. class Main
  20. {
  21.         public static void main(String[] args){
  22.                 Runs run=new Runs();//建立Runnable子类对象
  23.                 Thread t1=new Thread(run);//将Runnable子类对象作为Thread的构造方法  建立对象
  24.                 Thread t2=new Thread(run);
  25.                 Thread t3=new Thread(run);
  26.                 Thread t4=new Thread(run);
  27.                
  28.                 t1.start();
  29.                 t2.start();
  30.                 //t3.start();
  31.                 //t4.start();
  32.         }
  33. };</p>
复制代码

我已经使用了同步机制,为什么 还会打印“0”呢?

7 个回复

倒序浏览
你不是用的同一把锁啊,
回复 使用道具 举报
kerner 发表于 2014-12-4 23:00
你不是用的同一把锁啊,

怎么不是了
回复 使用道具 举报

  synchronized(new Object()){//同步代码块
每个线程不是同一把锁。
回复 使用道具 举报
你用匿名对象,每个线程都会new 一个对象,所以锁的对象不一样,就不是同一把锁
回复 使用道具 举报
你加的锁是我见过最有个性的,哈哈{:2_36:}
回复 使用道具 举报
你每次开启一个新的线程,都用new object新建一个对象作为锁,所以每次所用到的锁是不同的.
回复 使用道具 举报
chudaming213 发表于 2014-12-6 13:00
你每次开启一个新的线程,都用new object新建一个对象作为锁,所以每次所用到的锁是不同的. ...

谢谢回答  已经明白了
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马