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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 京鱼龙 中级黑马   /  2012-7-21 14:06  /  1761 人查看  /  2 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 罗京雨 于 2012-7-22 10:17 编辑

毕老师讲的车票问题
class Ticket implements Runnable
{
private int num = 200;
Object obj = new Object();
public void run()
{
  while(true)
  {
   synchronized(obj)
   {
    if(num>0)  //这里打印出来能出现0,-1,-2票的问题。我不明白的是num=0了,下面的就不运行了,怎么还会出现-1,-2呢?车票在thread-0,thread-1,thread-                     2, thread-3,thread-4,四个线程之间来回切换。假如thread-0卖了最后一张票num=0,if判断不对,应该停止了下面3个线程的切换了。-1,-2怎么得来的
    {
     try{Thread.sleep(10);}catch(InterruptedException e){}
     System.out.println(Thread.currentThread().getName()+".....sale....."+num--);
    }
   }
  }
}
}
class ThreadSynDemo
{
public static void main(String[] args)
{
  Ticket t = new Ticket();
  
  //创建线程对象。
  
  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();
}
}

求大侠们帮忙解答啊

2 个回复

倒序浏览
if(num>0)     {
//假设 num =1 时候 thread-0 判断 num>0 成立 进入 在 下一句 休眠了 一会儿 这个时候 num 还是 1
// 如果另一个线程 thread-1 执行到这里 判断 num>0 是不是也会执行……所以num 将要被减两次……如果多个线程在 num 被减前 进入 这段代码 ,那 num 将被减多次了……
     try{Thread.sleep(10);}catch(InterruptedException e){}

     System.out.println(Thread.currentThread().getName()+".....sale....."+num--);
    }
回复 使用道具 举报
线程的执行:
    因为多个线程都获取cpu的执行权。cpu执行到谁,谁就运行。
    明确一点,在某一个时刻,只能有一个程序在运行。(多核除外)
    cpu在做着快速的切换,以达到看上去是同时运行的效果。
    我们可以形象把多线程的运行行为在互相抢夺cpu的执行权。
    这就是多线程的一个特性:随机性。谁抢到谁执行,至于执行多长,cpu说的算。
所以某一线程的在执行if(num>0)之后可能立即被其他线程抢到执行权,还没来得及执行num--
再次进行if(num>0) 判断,仍然满足,所以后来依次执行num--,具体结果出现-1,-2,这都是
可能的,要看线程的状态


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