zoukankan      html  css  js  c++  java
  • 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 }

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

  • 相关阅读:
    [学习笔记] php设计模式总结 [转]
    [学习笔记] Windows下搭建PHP开发环境[转载]
    [学习笔记] PHP中this,self,parent的区别 [转载]
    [学习笔记] mysql连接数据库[转]
    [学习笔记] Memcache [转载]
    [学习笔记] PHPUnit 使用方法 [转载]
    [学习笔记] 正则表达式30分钟入门教程 [转]
    [学习笔记] Linux软连接和硬链接 [转]
    HLSL Matrix变量的存储方式
    Hieroglyph3 框架分析2
  • 原文地址:https://www.cnblogs.com/lanjianhappy/p/6384025.html
Copyright © 2011-2022 走看看