java多线程(三)之售票案例

售票案例:

火车站3个窗口售100张票.

1.自定义类SellTicket.java

 1 package com.test.com.pers.thread;
 2 
 3 /**
 4  * Created by yadongliang on 2018/1/17 0017.
 5  */
 6 public class SellTicket implements Runnable {
 7 
 8     // 定义票数
 9     private int ticketCount = 100;
10     // 定义锁对象
11     private Object object = new Object();
12 
13     @Override
14     public void run() {
15         while(true){
16             synchronized(object){// 同步机制, 同步代码块
17                 if (ticketCount > 0){
18                     try {
19                         Thread.sleep(100);// 为了模拟真实场景, 延迟100毫秒, 这样会出现同票和负数票(随机性和延迟性导致)问题(线程安全问题)
20                     } catch (InterruptedException e) {
21                         e.printStackTrace();
22                     }
23                     System.out.println(Thread.currentThread().getName() + " 正在出售第: " + (ticketCount--) + " 张票...");
24                 }
25             }
26         }
27     }
28 }

2.SellTicketDemo.java

package com.test.com.pers.thread;

/**
 * Created by yadongliang on 2018/1/17 0017.
 *
 * 如何解决线程安全问题:
 *  要想解决线程安全问题, 首先要知道哪些原因会导致出问题:(这些问题也是判断一个程序是否会有安全问题的标准)
 *      1.是否是多线程环境
 *      2.是否有共享数据
 *      3.是否有多条语句操作共享数据(是否是原子性操作)
 * 如何解决呢?
 *  思想:
 *      把多条语句操作共享数据的代码包成一个整体, 让某个线程执行的过程中, 别的线程不能执行.
 *  具体操作:
 *      引入了同步机制这个概念.
 *  同步代码块:
 *      synchronized(对象){
 *          需要同步的代码;
 *      }
 *      1.对象是什么?
 *          可以随便创建一个对象
 *      2.需要同步的代码是什么?
 *          多条语句操作共享数据的代码
 *      注意: 同步可以解决线程安全问题的根本原因就在这个对象身上, 该对象如同锁的功能, 多个线程必须是同一把锁.
 */
public class SellTicketDemo {

    public static void main(String[] args) {
        // 创建自定义类实例
        SellTicket sellTicket = new SellTicket();
        // 创建线程对象(窗口)
        Thread t1 = new Thread(sellTicket, "窗口1");
        Thread t2 = new Thread(sellTicket, "窗口2");
        Thread t3 = new Thread(sellTicket, "窗口3");
        // 启动线程
        t1.start();
        t2.start();
        t3.start();
    }
}

执行结果:

  1 窗口1 正在出售第: 100 张票...
  2 窗口1 正在出售第: 99 张票...
  3 窗口1 正在出售第: 98 张票...
  4 窗口1 正在出售第: 97 张票...
  5 窗口1 正在出售第: 96 张票...
  6 窗口1 正在出售第: 95 张票...
  7 窗口1 正在出售第: 94 张票...
  8 窗口1 正在出售第: 93 张票...
  9 窗口1 正在出售第: 92 张票...
 10 窗口1 正在出售第: 91 张票...
 11 窗口1 正在出售第: 90 张票...
 12 窗口1 正在出售第: 89 张票...
 13 窗口1 正在出售第: 88 张票...
 14 窗口1 正在出售第: 87 张票...
 15 窗口1 正在出售第: 86 张票...
 16 窗口1 正在出售第: 85 张票...
 17 窗口1 正在出售第: 84 张票...
 18 窗口1 正在出售第: 83 张票...
 19 窗口1 正在出售第: 82 张票...
 20 窗口1 正在出售第: 81 张票...
 21 窗口1 正在出售第: 80 张票...
 22 窗口1 正在出售第: 79 张票...
 23 窗口3 正在出售第: 78 张票...
 24 窗口3 正在出售第: 77 张票...
 25 窗口3 正在出售第: 76 张票...
 26 窗口3 正在出售第: 75 张票...
 27 窗口3 正在出售第: 74 张票...
 28 窗口3 正在出售第: 73 张票...
 29 窗口2 正在出售第: 72 张票...
 30 窗口3 正在出售第: 71 张票...
 31 窗口3 正在出售第: 70 张票...
 32 窗口3 正在出售第: 69 张票...
 33 窗口3 正在出售第: 68 张票...
 34 窗口3 正在出售第: 67 张票...
 35 窗口3 正在出售第: 66 张票...
 36 窗口3 正在出售第: 65 张票...
 37 窗口3 正在出售第: 64 张票...
 38 窗口3 正在出售第: 63 张票...
 39 窗口3 正在出售第: 62 张票...
 40 窗口3 正在出售第: 61 张票...
 41 窗口3 正在出售第: 60 张票...
 42 窗口3 正在出售第: 59 张票...
 43 窗口3 正在出售第: 58 张票...
 44 窗口3 正在出售第: 57 张票...
 45 窗口1 正在出售第: 56 张票...
 46 窗口1 正在出售第: 55 张票...
 47 窗口1 正在出售第: 54 张票...
 48 窗口1 正在出售第: 53 张票...
 49 窗口1 正在出售第: 52 张票...
 50 窗口3 正在出售第: 51 张票...
 51 窗口2 正在出售第: 50 张票...
 52 窗口2 正在出售第: 49 张票...
 53 窗口3 正在出售第: 48 张票...
 54 窗口3 正在出售第: 47 张票...
 55 窗口3 正在出售第: 46 张票...
 56 窗口3 正在出售第: 45 张票...
 57 窗口3 正在出售第: 44 张票...
 58 窗口3 正在出售第: 43 张票...
 59 窗口1 正在出售第: 42 张票...
 60 窗口1 正在出售第: 41 张票...
 61 窗口1 正在出售第: 40 张票...
 62 窗口3 正在出售第: 39 张票...
 63 窗口3 正在出售第: 38 张票...
 64 窗口3 正在出售第: 37 张票...
 65 窗口3 正在出售第: 36 张票...
 66 窗口3 正在出售第: 35 张票...
 67 窗口3 正在出售第: 34 张票...
 68 窗口3 正在出售第: 33 张票...
 69 窗口3 正在出售第: 32 张票...
 70 窗口2 正在出售第: 31 张票...
 71 窗口3 正在出售第: 30 张票...
 72 窗口3 正在出售第: 29 张票...
 73 窗口3 正在出售第: 28 张票...
 74 窗口3 正在出售第: 27 张票...
 75 窗口3 正在出售第: 26 张票...
 76 窗口1 正在出售第: 25 张票...
 77 窗口1 正在出售第: 24 张票...
 78 窗口1 正在出售第: 23 张票...
 79 窗口1 正在出售第: 22 张票...
 80 窗口1 正在出售第: 21 张票...
 81 窗口1 正在出售第: 20 张票...
 82 窗口1 正在出售第: 19 张票...
 83 窗口1 正在出售第: 18 张票...
 84 窗口1 正在出售第: 17 张票...
 85 窗口3 正在出售第: 16 张票...
 86 窗口2 正在出售第: 15 张票...
 87 窗口2 正在出售第: 14 张票...
 88 窗口2 正在出售第: 13 张票...
 89 窗口3 正在出售第: 12 张票...
 90 窗口3 正在出售第: 11 张票...
 91 窗口3 正在出售第: 10 张票...
 92 窗口3 正在出售第: 9 张票...
 93 窗口3 正在出售第: 8 张票...
 94 窗口3 正在出售第: 7 张票...
 95 窗口1 正在出售第: 6 张票...
 96 窗口1 正在出售第: 5 张票...
 97 窗口1 正在出售第: 4 张票...
 98 窗口1 正在出售第: 3 张票...
 99 窗口1 正在出售第: 2 张票...
100 窗口1 正在出售第: 1 张票...
View Code
原文地址:https://www.cnblogs.com/yadongliang/p/8305045.html