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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

  1. class  Demo implements Runnable
  2. {
  3.         private String name;
  4.         private static int t=100;
  5.         Demo(String name)
  6.         {
  7.                 this.name=name;
  8.         }
  9.         Object obj=new Object();
  10.         public void run()
  11.         {
  12.                
  13.                 synchronized(obj)
  14.                 {
  15.                         while(t>0)
  16.                         {
  17.                                 try
  18.                                 {
  19.                                         Thread.sleep(20);       
  20.                                 }       
  21.                                        
  22.                                 catch (Exception e)
  23.                                 {
  24.                                 }
  25.                                 System.out.println(Thread.currentThread().getName()+"...run"+t--);
  26.                         }
  27.                 }
  28.                
  29.                
  30.        
  31.         }
  32. }
  33. class RunnableDemo
  34. {
  35.         public static void main(String[] args)
  36.         {
  37.                 Thread t1=new Thread(new Demo("d1"));
  38.                 Thread t2=new Thread(new Demo("d2"));
  39.                 Thread t3=new Thread(new Demo("d3"));
  40.                 Thread t4=new Thread(new Demo("d4"));
  41.                 t1.start();
  42.                 t2.start();
  43.                 t3.start();
  44.                 t4.start();
  45.         }
  46. }
复制代码
对多线程操作的部分加了锁,为什么还是出现打印结果是负数的情况呢?是循环的问题么?

4 个回复

正序浏览
zq19910303 发表于 2015-5-18 19:16
这是因为你锁里面的代码导致的,当线程t1运行到锁里面时不将while循环结束,其他的线程是进不了锁的,而循 ...

:L,多个线程拿的不是同一个锁好嘛
回复 使用道具 举报
秒懂................
回复 使用道具 举报
zq19910303 发表于 2015-5-18 19:16
这是因为你锁里面的代码导致的,当线程t1运行到锁里面时不将while循环结束,其他的线程是进不了锁的,而循 ...

呀呀。。大神!!厉害。。我好像懂了。。
回复 使用道具 举报
本帖最后由 zq19910303 于 2015-5-19 22:18 编辑

这是因为你锁里面的代码导致的,当线程t1运行到锁里面时不将while循环结束,其他的线程是进不了锁的,而循环结束了,其他的线程就不必运行了,所以你应该将13行到27行的代码改为
  1. while(ture)
  2. {
  3.         synchronized(Obj)
  4.     {
  5.            if (t>0)
  6.            {
  7.                         try
  8.                         {
  9.                                 Thread.sleep(20);        
  10.                         }        
  11.                                                                                        
  12.                         catch (Exception e)
  13.                         {
  14.                         }
  15.                 System.out.println(Thread.currentThread().getName()+"...run"+t--);
  16.            }
  17.         }
  18. }
复制代码


这样就避免了一个线程在锁里面不循环结束就不解除锁的状态了

回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马