package cn.itcast_03;
/*
* 我们在前面讲解的电影院售票程序,从表面上看,没什么问题
* 但是在,真实的生活中,售票时网络时不能实时传输
* 会有延迟的
*
* 通过加入延迟,就产生了几个问题
* A:相同的票买了多次
* CPU的操作必须是原子性(最简单的操作)的
* B:出现了负数票
* 随机性
* 和延迟
*
*/
import cn.itcast_03.MyRunnable;
public class 买电影票出现的了通票和负数票的原因分析 {
public static void main(String[] args) {
//创建资源对象
MyRunnable my = new MyRunnable();
//创建三个线程对象
Thread t1 = new Thread(my,"窗口1");
Thread t2 = new Thread(my,"窗口2");
Thread t3 = new Thread(my,"窗口3");
//启动线程
t1.start();
t2.start();
t3.start();//创建资源对象
}
}
package cn.itcast_03;
//相同的票出现的原因解析
//public class MyRunnable implements Runnable {
// //定义100章票
// private static int ticked = 100;
// @Override
// public void run() {
// while(true) {
// if(ticked>0) {
// //t1 t2 t3三个线程
// //这一次tickets = 100
//
// try {
// //为了更真实的摸拟场景,我们稍作休息
// Thread.sleep(100);//t1进来了,t2进来了
// } catch (InterruptedException e) {
// e.printStackTrace();
// }
// System.out.println(Thread.currentThread().getName()+"正在出售第"+(ticked--)+"票");
//
// //窗口1正在出售第100张票
// //窗口2正在出售第99张票
// //这是理性状态
// //CPU的每一次操作都是原子性的(最简单的)操作
// //单tickets--不是原子性的操作
// //它先记录以前的值
// //接着tickets--
// //输出以前到值100(但是,在这时t2进来了它也变成了100,所以出现了相同的票)
// //然后tickets值就变成了99
// //输出窗口1正在出售第100张票
// }
//
// }
//
// }
//出现了负数票原因的解析
public class MyRunnable implements Runnable {
//定义100章票
private static int ticked = 100;
@Override
public void run() {
while(true) {
if(ticked>0) {
//t1 t2 t3三个线程
//这一次tickets = 1
try {
//为了更真实的摸拟场景,我们稍作休息
Thread.sleep(100);//t1进来了并休息,t2进来了并休息,t3进来了并休息
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println(Thread.currentThread().getName()+"正在出售第"+(ticked--)+"票");
//窗口正在出售第一张票,tickets = 0;
//窗口正在出售第二张票,tickets = -1;
//窗口正在出售第三张票,tickets = -2;
}
}
}
}