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;
@Override
public void run() {
while (true){
if(tickets>0){ // 1
try {
// w2, w3, w1
Thread.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();
}
}
标签:窗口,Thread,张票,安全,window,实例,线程,......
From: https://www.cnblogs.com/qiwei-bigdata/p/18368158