通过加入延迟后,就产生了连个问题:
* A:相同的票卖了多次
* CPU的一次操作必须是原子性的
* B:出现了负数票
* 随机性和延迟导致的
1 public class SellTicketDemo { 2 public static void main(String[] args) { 3 // 创建资源对象 4 SellTicket st = new SellTicket(); 5 6 // 创建三个线程对象 7 Thread t1 = new Thread(st, "窗口1"); 8 Thread t2 = new Thread(st, "窗口2"); 9 Thread t3 = new Thread(st, "窗口3"); 10 11 // 启动线程 12 t1.start(); 13 t2.start(); 14 t3.start(); 15 } 16 } 17 public class SellTicket implements Runnable { 18 // 定义100张票 19 private int tickets = 100; 20 21 // @Override 22 // public void run() { 23 // while (true) { 24 // // t1,t2,t3三个线程 25 // // 这一次的tickets = 100; 26 // if (tickets > 0) { 27 // // 为了模拟更真实的场景,我们稍作休息 28 // try { 29 // Thread.sleep(100); // t1就稍作休息,t2就稍作休息 30 // } catch (InterruptedException e) { 31 // e.printStackTrace(); 32 // } 33 // 34 // System.out.println(Thread.currentThread().getName() + "正在出售第" 35 // + (tickets--) + "张票"); 36 // // 理想状态: 37 // // 窗口1正在出售第100张票 38 // // 窗口2正在出售第99张票 39 // // 但是呢? 40 // // CPU的每一次执行必须是一个原子性(最简单基本的)的操作。 41 // // 先记录以前的值 42 // // 接着把ticket-- 43 // // 然后输出以前的值(t2来了) 44 // // ticket的值就变成了99 45 // // 窗口1正在出售第100张票 46 // // 窗口2正在出售第100张票 47 // 48 // } 49 // } 50 // } 51 52 @Override 53 public void run() { 54 while (true) { 55 // t1,t2,t3三个线程 56 // 这一次的tickets = 1; 57 if (tickets > 0) { 58 // 为了模拟更真实的场景,我们稍作休息 59 try { 60 Thread.sleep(100); //t1进来了并休息,t2进来了并休息,t3进来了并休息, 61 } catch (InterruptedException e) { 62 e.printStackTrace(); 63 } 64 65 System.out.println(Thread.currentThread().getName() + "正在出售第" 66 + (tickets--) + "张票"); 67 //窗口1正在出售第1张票,tickets=0 68 //窗口2正在出售第0张票,tickets=-1 69 //窗口3正在出售第-1张票,tickets=-2 70 } 71 } 72 } 73 }
此时仍然有安全问题->>>>>>>
原文:http://www.cnblogs.com/lanjianhappy/p/6384025.html