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();
}
}
}
thread32 - 售票4
最新推荐文章于 2019-12-06 00:35:02 发布