thread32

来源:互联网 发布:exe解压软件安卓版 编辑:程序博客网 时间:2024/06/18 01:38
package com.neutron.t21;import java.util.ArrayList;import java.util.List;import java.util.concurrent.TimeUnit;import java.util.concurrent.locks.Lock;import java.util.concurrent.locks.ReentrantLock;/** * 有N张火车票,每张票都有1个编号,同时有10个窗口对外售票 * * 分析下面程序可能存在哪些问题:重复售票,还是超量售票? */public class Ticket4 {    static List<String> tickets = new ArrayList<>();    private static Lock lock = new ReentrantLock();    static {        for (int i = 0; i < 10000; i++) {            tickets.add("No:" + i);        }    }    /**     * 使用synchronized来解决问题,为什么呢?相当于判断和操作属于原子性操作,不会被打断     * 上述重复出售以及超量出售问题得到解决     */    public static void main(String[] args) {        for (int i = 0; i < 10; i++) {            new Thread(() -> {                while (true) {                    lock.lock();                    try {                        if (tickets.size() <= 0) {                            break;                        }                        TimeUnit.MICROSECONDS.sleep(6);                        System.out.println("sell ticket:" + tickets.remove(0));                    } catch (InterruptedException e) {                        e.printStackTrace();                    } finally {                        lock.unlock();                    }                }            }).start();        }    }}

原创粉丝点击