thread30

来源:互联网 发布:淘宝莆田高仿鞋店铺 编辑:程序博客网 时间:2024/06/05 07:55
package com.neutron.t21;import java.util.Vector;import java.util.concurrent.TimeUnit;/** * 有N张火车票,每张票都有1个编号,同时有10个窗口对外售票 * * 分析下面程序可能存在哪些问题:重复售票,还是超量售票? */public class Ticket2 {    /* 使用同步容器 */    static Vector<String> tickets = new Vector<>();    static {        for (int i = 0; i < 10000; i++) {            tickets.add("No:" + i);        }    }    /**     *  为什么会存在问题?     *  判断和操作相分离,即while时和remove之间存在问题。虽然size和remove都是原子性,但是两者组合并非是原子性     *  案例中使用睡6毫秒来测试     */    public static void main(String[] args) {        for (int i = 0; i < 10; i++) {            new Thread(() -> {                while (tickets.size() > 0) {                    try {                        TimeUnit.MICROSECONDS.sleep(6);                    } catch (InterruptedException e) {                        e.printStackTrace();                    }                    System.out.println("sell ticket:" + tickets.remove(0));                }            }).start();        }    }}

原创粉丝点击