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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 张权 中级黑马   /  2013-3-28 20:09  /  1056 人查看  /  5 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 张权 于 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();
        }
}

上面代码存在安全隐患, 应该要同步才行, 但是不知道怎么改?

评分

参与人数 1技术分 +1 收起 理由
滔哥 + 1

查看全部评分

5 个回复

倒序浏览

评分

参与人数 1技术分 +1 收起 理由
滔哥 + 1

查看全部评分

回复 使用道具 举报

  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天,里面有详细的介绍

评分

参与人数 1技术分 +2 收起 理由
滔哥 + 2

查看全部评分

回复 使用道具 举报
本帖最后由 张权 于 2013-3-28 20:35 编辑
似水像火 发表于 2013-3-28 20:27
看符不符合你的要求,只要加个锁就行了。你可以看毕向东java25天基础的11天,里面有详细的介绍 ...


为什么这里的锁是类名.class???求解释?
回复 使用道具 举报
张权 发表于 2013-3-28 20:32
为什么这里的锁是类名.class???求解释?

这个可以随便定义的!只要是是唯一的就行了。我是不想动你的代码?所以就直接.class文件了。你可以换成其他的
回复 使用道具 举报
似水像火 发表于 2013-3-28 20:48
这个可以随便定义的!只要是是唯一的就行了。我是不想动你的代码?所以就直接.class文件了。你可以换成其 ...

恩!!!!!!!!!!!!!!!!!!!!
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马