多线程-买电影票出现了同票和负数票的原因分析
2017-06-03 09:05
316 查看
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) { e.printStackTrace(); } System.out.println(Thread.currentThread().getName() + "正在出售第" + (tickets--) + "张票"); // 理想状态: // 窗口1正在出售第100张票 // 窗口2正在出售第99张票 // 但是呢? // CPU的每一次执行必须是一个原子性(最简单基本的)的操作。 // 先记录以前的值 // 接着把ticket-- // 然后输出以前的值(t2来了) // ticket的值就变成了99 // 窗口1正在出售第100张票 // 窗口2正在出售第100张票 } } } @Override public void run() { while (true) { // t1,t2,t3三个线程 // 这一次的tickets = 1; if (tickets > 0) { // 为了模拟更真实的场景,我们稍作休息 try { Thread.sleep(100); //t1进来了并休息,t2进来了并休息,t3进来了并休息, } catch (InterruptedException e) { e.printStackTrace(); } System.out.println(Thread.currentThread().getName() + "正在出售第" + (tickets--) + "张票"); //窗口1正在出售第1张票,tickets=0 //窗口2正在出售第0张票,tickets=-1 //窗口3正在出售第-1张票,tickets=-2 } } } }
package cn.itcast_08;
/*
* 实现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();
}
}
相关文章推荐
- 多线程_买电影票出现了同票和负数票的原因分析
- 多线程出现卖相同票号码和负数票分析
- 无法分析从服务器收到的消息。之所以出现此错误,常见的原因是: 在通过调用 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的原因分析