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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

class SellTicket extends Thread                        //买票的功能
{
        private static int sum = 10;                //设定票的总数
        public void run()                                        //买票的方法
        {

                while (sum>0)
                {
                        try
                        {
                                sleep(100);                                //设定延时
                        }
                        catch (Exception e)
                        {
                        }
                        System.out.println(this.getName()+"卖出的票号为"+(--sum));
                       
                        }
        }
}

class ThreadTest__1
{
        public static void main(String[] args)
        {
                SellTicket aa = new SellTicket();
                aa.setName("售票员一");
                aa.start();
               
                SellTicket bb = new SellTicket();
                bb.setName("售票员MMMMMM");
                bb.start();
               
        }
}
/*
                运行结果
=================================
售票员MMMMMM卖出的票号为9
售票员一卖出的票号为8
售票员一卖出的票号为7
售票员MMMMMM卖出的票号为7
售票员一卖出的票号为6
售票员MMMMMM卖出的票号为5
售票员一卖出的票号为4
售票员MMMMMM卖出的票号为3
售票员一卖出的票号为2
售票员MMMMMM卖出的票号为1
售票员一卖出的票号为0
售票员MMMMMM卖出的票号为-1
=================================

在这个程序中我加sleep()语句是为了让这个程序暴露安全问题(打出票号为-1的票),我知道代码该如何优化,我只是没有想明白怎么会出现两张7号票呢?

,--x和打印是在一条语句里面。为什么会出现两张7号票呢?

这个结果是随机出现的,请各位大哥分析一下执行过程,谢谢。

*/

评分

参与人数 1技术分 +1 收起 理由
冯海霞 + 1

查看全部评分

3 个回复

正序浏览
我感觉是记得计算机疯了  是不是双核的问题,一个cpu打印 了  还没来得急把sum值修正  另一个就又打印了  应不会出现这个问题啊
回复 使用道具 举报
问题在于当线程aa访问sum时,还没来得及修改sum值,线程bb就同时访问sum了
我们就不能让aa线程和bb线程同时访问sum值

可以这样修改:在你的代码中加一点点东西就可以了(加把锁
  1. public class ThreadTest__1 {

  2.         /**
  3.          * @param args
  4.          */
  5.         public static void main(String[] args) {
  6.                 // TODO Auto-generated method stub
  7.                  SellTicket aa = new SellTicket();
  8.          aa.setName("售票员一");
  9.          aa.start();
  10.         
  11.          SellTicket bb = new SellTicket();
  12.          bb.setName("售票员MMMMMM");
  13.          bb.start();
  14.         }

  15. }
  16. class SellTicket extends Thread                        //买票的功能
  17. {
  18.         private static int sum = 10;                //设定票的总数
  19.         public void run()                                        //买票的方法
  20.         {
  21.                 synchronized (this) {        // 在这里加个对象锁就可以了,就是说不能两个线程同时访问或者修改【sum】
  22.                         while (sum>0)
  23.                 {
  24.                         try
  25.                         {
  26.                                 sleep(100);                                //设定延时
  27.                         }
  28.                         catch (Exception e)
  29.                         {
  30.                         }
  31.                         System.out.println(this.getName()+"卖出的票号为"+(--sum));
  32.                  }
  33.                         }
  34.                
  35.         }
  36. }
复制代码

评分

参与人数 1技术分 +1 收起 理由
冯海霞 + 1

查看全部评分

回复 使用道具 举报
你这个是线程互斥问题,等下,我来修正下你的代码
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马