黑马程序员技术交流社区

标题: 帮忙改下下面代码,线程安全问题 [打印本页]

作者: 张权    时间: 2013-3-28 20:09
标题: 帮忙改下下面代码,线程安全问题
本帖最后由 张权 于 2013-3-28 20:47 编辑

/*
*创建一个票库类, 票库类有票数属性 , 有查看票数的方法等
*/
class PiaoKu {
        //定义票数属性
        private int count;
        
        //定义票库有参构造器, 目的是为了能够给票库自定义票数
        public PiaoKu(int count) {
                this.count = count;
        }
        
        //该方法可以用来查看票库的票数
        public int getCount() {
                return count;
        }

        //当票卖出后,返回卖出去的票号
        public int shouPiao() {
                return count--;
        }
}

/*
* 定义一个窗口类, 窗口类有票库属性, 因为卖票要冲票库拿票
*/
class ChuangKou extends Thread {
        private PiaoKu pk;

        public ChuangKou(PiaoKu pk) {
                this.pk = pk;
        }

        public void run() {
                while (true) {
                        //查询票数,当票数小于等于0时,跳出循环
                        if (pk.getCount() <= 0) {
                                break;
                        }
                        try {
                                Thread.sleep(10);
                        } catch (InterruptedException i) {
                        }
                        System.out.println(getName() + "  :  " + pk.shouPiao());

                }
        }
}

class Test {
        public static void main(String[] args) {
                PiaoKu pk = new PiaoKu(100);

                Thread t1 = new ChuangKou(pk);
                Thread t2 = new ChuangKou(pk);
                Thread t3 = new ChuangKou(pk);
                Thread t4 = new ChuangKou(pk);

                t1.start();
                t2.start();
                t3.start();
                t4.start();
        }
}

上面代码存在安全隐患, 应该要同步才行, 但是不知道怎么改?
作者: 黄小贝    时间: 2013-3-28 20:27


作者: 刘胜寒    时间: 2013-3-28 20:27

  1. /*
  2. *创建一个票库类, 票库类有票数属性 , 有查看票数的方法等
  3. */
  4. class PiaoKu {
  5.         //定义票数属性
  6.         private int count;
  7.         
  8.         //定义票库有参构造器, 目的是为了能够给票库自定义票数
  9.         public PiaoKu(int count) {
  10.                 this.count = count;
  11.         }
  12.         
  13.         //该方法可以用来查看票库的票数
  14.         public int getCount() {
  15.                 return count;
  16.         }

  17.         //当票卖出后,返回卖出去的票号
  18.         public int shouPiao() {
  19.                 return count--;
  20.         }
  21. }

  22. /*
  23. * 定义一个窗口类, 窗口类有票库属性, 因为卖票要冲票库拿票
  24. */
  25. class ChuangKou extends Thread {
  26.         private PiaoKu pk;

  27.         public ChuangKou(PiaoKu pk) {
  28.                 this.pk = pk;
  29.         }

  30.         public void run() {
  31.                
  32.                 while (true) {
  33.                         synchronized(Main.class)
  34.                         {
  35.                         //查询票数,当票数小于等于0时,跳出循环
  36.                         if (pk.getCount() <= 0) {
  37.                                 break;
  38.                         }
  39.                         try {
  40.                                 Thread.sleep(10);
  41.                         } catch (InterruptedException i) {
  42.                         }
  43.                         System.out.println(getName() + "  :  " + pk.shouPiao());

  44.                 }
  45.                 }
  46.         }
  47. }

  48. class Test {
  49.         public static void main(String[] args) {
  50.                 PiaoKu pk = new PiaoKu(100);

  51.                 Thread t1 = new ChuangKou(pk);
  52.                 Thread t2 = new ChuangKou(pk);
  53.                 Thread t3 = new ChuangKou(pk);
  54.                 Thread t4 = new ChuangKou(pk);

  55.                 t1.start();
  56.                 t2.start();
  57.                 t3.start();
  58.                 t4.start();
  59.         }
  60. }
复制代码
看符不符合你的要求,只要加个锁就行了。你可以看毕向东java25天基础的11天,里面有详细的介绍
作者: 张权    时间: 2013-3-28 20:32
本帖最后由 张权 于 2013-3-28 20:35 编辑
似水像火 发表于 2013-3-28 20:27
看符不符合你的要求,只要加个锁就行了。你可以看毕向东java25天基础的11天,里面有详细的介绍 ...


为什么这里的锁是类名.class???求解释?
作者: 刘胜寒    时间: 2013-3-28 20:48
张权 发表于 2013-3-28 20:32
为什么这里的锁是类名.class???求解释?

这个可以随便定义的!只要是是唯一的就行了。我是不想动你的代码?所以就直接.class文件了。你可以换成其他的
作者: 张权    时间: 2013-4-3 11:48
似水像火 发表于 2013-3-28 20:48
这个可以随便定义的!只要是是唯一的就行了。我是不想动你的代码?所以就直接.class文件了。你可以换成其 ...

恩!!!!!!!!!!!!!!!!!!!!




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