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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 徐传任 中级黑马   /  2012-10-10 13:19  /  1358 人查看  /  1 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

  • public class TicketDemo {
  •         public static void main(String[] args) {
  •                 Ticket t = new Ticket();
  •                 Thread t0 = new Thread(t);
  •                 Thread t1 = new Thread(t);
  •                 t0.setName("窗口一:");
  •                 t1.setName("窗口二:");
  •                 t0.start();
  •                 t1.start();
  •         }
  • }
  • class Ticket implements Runnable {
  •         private int num = 100;
  •         public void run() {
  •                 while(true) {
  •                         try {
  •                                 sell();
  •                         } catch (InterruptedException e) {
  •                                 e.printStackTrace();
  •                         }
  •                 }
  •         }
  •         public void sell() throws InterruptedException {
  •                 if(num>0) {
  •                         Thread.sleep(10);
  •                         System.out.println(Thread.currentThread().getName()+"卖票啦,卖票啦"+num--);
  •                 }
  •         }
  • }

复制代码
我知道会产生安全问题,会出现0号票,不安全。但是我在运行的时候突然发现有两个同号的票,这个问题是怎么产生的。
窗口一卖票啦,卖票啦80
窗口二卖票啦,卖票啦80
窗口二卖票啦,卖票啦79
窗口一卖票啦,卖票啦78
窗口二卖票啦,卖票啦77
窗口一卖票啦,卖票啦76
窗口一卖票啦,卖票啦75
为什么会出现两个80号票呢?
是 num--在运行后给num赋值期间出现的问题吗?
如果分开写
System.out.println(Thread.currentThread().getName()+"卖票啦,卖票啦"+num);
num--;这样我知道是两条语句出现问题,
但是System.out.println(Thread.currentThread().getName()+"卖票啦,卖票啦"+num--);这不是一条语句吗为什么还会出现问题。
具体System.out.println(Thread.currentThread().getName()+"卖票啦,卖票啦"+num--);这条语句在多线程期间是怎么出现同号票安全问题的原因的,麻烦给解释下

1 个回复

倒序浏览
多线程,要对操作的资源加锁,同步一下,就不会卖一样的票了
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马