黑马程序员技术交流社区

标题: 关于多线程的问题,请各位大侠帮忙分析一下,谢谢。 [打印本页]

作者: 何仕映    时间: 2013-3-6 14:38
标题: 关于多线程的问题,请各位大侠帮忙分析一下,谢谢。
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号票呢?

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

*/
作者: 张晋瑜    时间: 2013-3-6 15:39
你这个是线程互斥问题,等下,我来修正下你的代码
作者: 张晋瑜    时间: 2013-3-6 15:41
问题在于当线程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. }
复制代码

作者: amen0205    时间: 2013-3-6 23:37
我感觉是记得计算机疯了  是不是双核的问题,一个cpu打印 了  还没来得急把sum值修正  另一个就又打印了  应不会出现这个问题啊





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