欢迎来到贱贱的博客

扩大
缩小

java笔记线程电影院卖票改进版

通过加入延迟后,就产生了连个问题:
 * A:相同的票卖了多次
 *   CPU的一次操作必须是原子性的
 * B:出现了负数票
 *   随机性和延迟导致的

 1 public class SellTicketDemo {
 2     public static void main(String[] args) {
 3         // 创建资源对象
 4         SellTicket st = new SellTicket();
 5 
 6         // 创建三个线程对象
 7         Thread t1 = new Thread(st, "窗口1");
 8         Thread t2 = new Thread(st, "窗口2");
 9         Thread t3 = new Thread(st, "窗口3");
10 
11         // 启动线程
12         t1.start();
13         t2.start();
14         t3.start();
15     }
16 }
17 public class SellTicket implements Runnable {
18     // 定义100张票
19     private int tickets = 100;
20 
21 //    @Override
22 //    public void run() {
23 //        while (true) {
24 //            // t1,t2,t3三个线程
25 //            // 这一次的tickets = 100;
26 //            if (tickets > 0) {
27 //                // 为了模拟更真实的场景,我们稍作休息
28 //                try {
29 //                    Thread.sleep(100); // t1就稍作休息,t2就稍作休息
30 //                } catch (InterruptedException e) {
31 //                    e.printStackTrace();
32 //                }
33 //
34 //                System.out.println(Thread.currentThread().getName() + "正在出售第"
35 //                        + (tickets--) + "张票");
36 //                // 理想状态:
37 //                // 窗口1正在出售第100张票
38 //                // 窗口2正在出售第99张票
39 //                // 但是呢?
40 //                // CPU的每一次执行必须是一个原子性(最简单基本的)的操作。
41 //                // 先记录以前的值
42 //                // 接着把ticket--
43 //                // 然后输出以前的值(t2来了)
44 //                // ticket的值就变成了99
45 //                // 窗口1正在出售第100张票
46 //                // 窗口2正在出售第100张票
47 //
48 //            }
49 //        }
50 //    }
51     
52     @Override
53     public void run() {
54         while (true) {
55             // t1,t2,t3三个线程
56             // 这一次的tickets = 1;
57             if (tickets > 0) {
58                 // 为了模拟更真实的场景,我们稍作休息
59                 try {
60                     Thread.sleep(100); //t1进来了并休息,t2进来了并休息,t3进来了并休息,
61                 } catch (InterruptedException e) {
62                     e.printStackTrace();
63                 }
64 
65                 System.out.println(Thread.currentThread().getName() + "正在出售第"
66                         + (tickets--) + "张票");
67                 //窗口1正在出售第1张票,tickets=0
68                 //窗口2正在出售第0张票,tickets=-1
69                 //窗口3正在出售第-1张票,tickets=-2
70             }
71         }
72     }
73 }

此时仍然有安全问题->>>>>>>

posted on 2017-02-09 21:09  L的存在  阅读(327)  评论(0编辑  收藏  举报

导航