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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 杨卫腾 中级黑马   /  2012-6-3 11:05  /  1839 人查看  /  4 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 杨卫腾 于 2012-6-6 16:43 编辑
  1. class Ticket implements Runnable
  2. {
  3.         private int ticket = 100;
  4.         //private String name;
  5.         //Ticket(String name)
  6.         //{
  7.                 //this.name = name;
  8.         //}

  9.         public void run()
  10.         {
  11.                 while(ticket>0)
  12.                 {        
  13.                         try
  14.                         {
  15.                                 Thread.sleep(10);
  16.                         }
  17.                         catch(Exception e)
  18.                         {
  19.                         }
  20.                         System.out.println(Thread.currentThread().getName()+"sale..."+ticket--);
  21.                 }
  22.         }
  23. }
  24. class ThreadDemo4
  25. {
  26.         public static void main(String[] args)
  27.         {
  28.                 Ticket t = new Ticket();

  29.                 Thread t1 = new Thread(t);
  30.                 Thread t2 = new Thread(t);
  31.                 Thread t3 = new Thread(t);
  32.                 Thread t4 = new Thread(t);

  33.                 t1.start();
  34.                 t2.start();
  35.                 t3.start();
  36.                 t4.start();
  37.         }
  38. }
复制代码
毕老师说这个多线程程序有安全问题,我想了好久了,还是不太明白。比如线程0执行时的这个ticket=1>0 进入那个while循环打印,这时ticket=0,若线程2抢到这个执行权它不能进入while循环呀!怎么还能打印呢?我就想不明白,请大家帮帮我!

评分

参与人数 2技术分 +1 黑马币 +1 收起 理由
admin + 1
木小丰 + 1

查看全部评分

4 个回复

倒序浏览
ticket是共享数据,四个线程都可以访问,楼主这段代码中没有进行同步,所以会有安全问题存在,线程1修改完ticket后为0,因为没有枷锁,所以线程2是可以进入while循环的,所以就会有打印。
回复 使用道具 举报
何拴绪 发表于 2012-6-3 11:38
ticket是共享数据,四个线程都可以访问,楼主这段代码中没有进行同步,所以会有安全问题存在,线程1修改完t ...

嗯,我没有枷锁,就是思考下这个安全问题出现的过程。线程1运行完后,ticket=0了,条件不成立了,线程2怎么进入while循环呢   还是不太明白,
回复 使用道具 举报
这个是因为线程1还没有将ticket修改为1时,线程2已经进入了while循环中,这时线程1继续执行,将ticket修改为0,然后线程2执行打印时ticket已经为0了,就打印出了0。希望说的清楚了。呵呵

评分

参与人数 1技术分 +1 收起 理由
admin + 1

查看全部评分

回复 使用道具 举报
何拴绪 发表于 2012-6-3 12:36
这个是因为线程1还没有将ticket修改为1时,线程2已经进入了while循环中,这时线程1继续执行,将ticket修改 ...

嗯,明白了。  就是在条件成立的时候一个线程执行未结束时(就是ticket还没有运算为0时),其他的线程已经进入循环抢执行权了,所以会出现于实际不相符的情况。谢谢哥们指点迷津!!
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马