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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 嘻嘻哈哈嘻嘻 中级黑马   /  2014-7-16 15:34  /  1001 人查看  /  2 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

package xianchen;

class ticks2 implements Runnable//extends Thread
{
private int ticks = 100;
public void run()
{
  Object b = new Object();
  while(true)
  {
   synchronized(b)   //通过synchronized,同步代码块
   {
    if(ticks > 0)
    {
     try
     {
      Thread.sleep(10);
     }
     catch(Exception e)
     {
      
     }
     System.out.println(Thread.currentThread().getName()+"出票"+ticks--);
    }
   }
  }
}
}
public class test4 {
/**
  * @param args
  */
public static void main(String[] args) {
  // TODO Auto-generated method stub
  
  ticks2 t = new ticks2();
  
  Thread t1 = new Thread(t);
  Thread t2 = new Thread(t);
  Thread t3 = new Thread(t);
  Thread t4 = new Thread(t);
  t1.start();
  t2.start();
  t3.start();
  t4.start();

}
}
运行后还有打印出有负数的票,这是为什么?

同步代码块Synchronized.jpg (56.21 KB, 下载次数: 3)

运行后还是打印出有负数的票

运行后还是打印出有负数的票

2 个回复

倒序浏览
问题很明显啊,锁对象放run方法外面,你这样开启一个线程就给了一把锁,等于没加锁,锁只能有一个的
回复 使用道具 举报
当你的程序运行到1票时,票数还是大于0,就要TRY,其中一个线程就得等待,其他线程就直接打印了。我的理解
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马