package com.shujia.day19.sellTickets;/*使用Runnable的方式实现为了模拟更加真实的售票情况,我们加入延迟问题:我们加入了延迟之后,发现a. 有重复售卖同一张票的情况(原因1)b. 还出现了一个不该出现的票数据,比如第0张票,第-1张票(原因2)原因:1. cpu小小的时间片,足以让程序执行很多次2. 线程的执行具有随机性,且是抢占式执行的现象:线程不安全的现象如何判断一个程序是否存在线程不安全的现象呢?三要素(同时满足):1、是否存在多线程环境?2、是否存在共享数据?3、是否存在多条语句操作着共享数据?如何解决线程不安全的现象?1、同步代码块2、lock锁*/
class Window implements Runnable{private static int tickets = 100;@Overridepublic void run() {while (true){if(tickets>0){ // 1try {// w2, w3, w1Thread.sleep(50);//sleep()方法是静态的} catch (InterruptedException e) {e.printStackTrace();}System.out.println(Thread.currentThread().getName()+" 正在出售第 "+(tickets--)+" 张票......");//窗口3 正在出售第 97 张票......//窗口2 正在出售第 97 张票......//..//窗口2 正在出售第 1 张票......//窗口3 正在出售第 0 张票......//窗口1 正在出售第 -1 张票......}}}
}public class SellTicketDemo1 {public static void main(String[] args) {Window window = new Window();Thread w1 = new Thread(window,"窗口1");Thread w2 = new Thread(window,"窗口2");Thread w3 = new Thread(window,"窗口3");w1.start();w2.start();w3.start();}
}