黑马程序员技术交流社区

标题: 多线程安全那些疑问<已解决> [打印本页]

作者: 杨卫腾    时间: 2012-6-3 11:05
标题: 多线程安全那些疑问<已解决>
本帖最后由 杨卫腾 于 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循环呀!怎么还能打印呢?我就想不明白,请大家帮帮我!
作者: 何拴绪    时间: 2012-6-3 11:38
ticket是共享数据,四个线程都可以访问,楼主这段代码中没有进行同步,所以会有安全问题存在,线程1修改完ticket后为0,因为没有枷锁,所以线程2是可以进入while循环的,所以就会有打印。
作者: 杨卫腾    时间: 2012-6-3 11:50
何拴绪 发表于 2012-6-3 11:38
ticket是共享数据,四个线程都可以访问,楼主这段代码中没有进行同步,所以会有安全问题存在,线程1修改完t ...

嗯,我没有枷锁,就是思考下这个安全问题出现的过程。线程1运行完后,ticket=0了,条件不成立了,线程2怎么进入while循环呢   还是不太明白,
作者: 何拴绪    时间: 2012-6-3 12:36
这个是因为线程1还没有将ticket修改为1时,线程2已经进入了while循环中,这时线程1继续执行,将ticket修改为0,然后线程2执行打印时ticket已经为0了,就打印出了0。希望说的清楚了。呵呵
作者: 杨卫腾    时间: 2012-6-3 12:46
何拴绪 发表于 2012-6-3 12:36
这个是因为线程1还没有将ticket修改为1时,线程2已经进入了while循环中,这时线程1继续执行,将ticket修改 ...

嗯,明白了。  就是在条件成立的时候一个线程执行未结束时(就是ticket还没有运算为0时),其他的线程已经进入循环抢执行权了,所以会出现于实际不相符的情况。谢谢哥们指点迷津!!




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2