多线程_买电影票出现了同票和负数票的原因分析
2017-03-12 19:47
281 查看
package cn.itcast_08; /* * 某电影院正在上映贺岁大片(情圣,超级快递),共有100张票,而他有3个窗品售票,请设置一个程序模拟该电影院售票。 * 实现Runnable接口 * * 通过加入延迟后,就产生了两个问题: * A:相同的票出现多次 * CPU一次操作必须是原子性的。 * B:出现了负数票 * 随即性和延迟性导致的。 */ public class SellTicketDemo { public static void main(String[] args) { // 创建资源对象 SellTicket st = new SellTicket(); // 创建线程对象 Thread t1 = new Thread(st, "窗口1"); Thread t2 = new Thread(st, "窗口2"); Thread t3 = new Thread(st, "窗口3"); // 启动线程 t1.start(); t2.start(); t3.start(); } }
package cn.itcast_08;
public class SellTicket implements Runnable {
// 定义100张票
private int tickets = 100;
// @Override
// public void run() {
// while (true) {
// // t1,t2,t3三个线程
// // 这一次tickets = 100;
// if (tickets > 0) {
// // 为了模拟真实场景,我们稍作休息
// try {
// Thread.sleep(100);// t1就稍作休息,t2就稍作休息
// } catch (InterruptedException e) {
// // TODO Auto-generated catch block
// e.printStackTrace();
// }
// System.out.println(Thread.currentThread().getName() + "正在出售第"
// + (tickets--) + "张票");
// // 理想状态:
// // 窗口1正在出售第100张票
// // 窗口2正在出售第99张票
// // 但是呢?
// // CPU的每一次执行必须是一个原子性(最简单基本操作x=1,a=2)的操作。
// // 先记录以前的值
// // 接着把tickets--
// // 然后输出以前的值(t2来了)
// // tickets的值就变成了99
// // 窗口1正在出售第100张票
// // 窗口2正在出售第100张票
// }
// }
//
// }
@Override
public void run() {
while (true) {
// ta1,t2,t3三个线程
// 这一次的tickets = 1;
if (tickets > 0) {
// 为了模拟真实场景,我们稍作休息
try {
Thread.sleep(100);// t1进来并休息,t2进来并休息,t3进来并休息
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
System.out.println(Thread.currentThread().getName() + "正在出售第"
+ (tickets--) + "张票");
// 窗口1正在出售第1张票,tickets=0;
// 窗口2正在出售第0张票,tickets=-1;
// 窗口1正在出售第-1张票,tickets=-2;
}
}
}
}
相关文章推荐
- 多线程-买电影票出现了同票和负数票的原因分析
- 多线程出现卖相同票号码和负数票分析
- 无法分析从服务器收到的消息。之所以出现此错误,常见的原因是: 在通过调用 Response.Write() 修改响应时,将启用响应筛选器、HttpModule 或服务器跟踪。
- linux动态链接库出现段错误的原因分析
- HttpWatch的Result中出现Aborted的原因分析[配图]
- c 调用python出现异常的原因分析
- 分析ADSL拨号中出现的错误代码 原因及其解决办法
- 【转贴】JSON简介--简要分析了json的出现原因,及与xml比较的优缺点
- PHP中文乱码出现的原因及解决办法分析
- 浏览器预览PHP文件时顶部出现空白影响布局分析原因及解决办法
- 浮点运算结果出现误差原因分析及解决方案
- 网站频繁出现304状态码及抓取蜘蛛次数较少的原因分析
- 浮点运算结果出现误差原因分析及解决方案
- 无法分析从服务器收到的消息。之所以出现此错误,常见的原因是: 在通过调用 Response.Write() 修改响
- mysql执行时间为负数的原因分析
- 浏览器预览PHP文件时顶部出现空白影响布局分析原因及解决办法
- 无法分析从服务器收到的消息。之所以出现此错误,常见的原因是: 在通过调用 Response.Write() 修改响应时,将启用响应筛选器、HttpModule 或服务器跟踪。
- mysql执行时间为负数的原因分析
- 无法分析从服务器收到的消息。之所以出现此错误,常见的原因是: 在通过调用 Response.Write() 修改响应时,将启用响应筛选器、HttpModule 或服务器跟踪
- jquery中出现#('#xxxx')is null的原因分析