2017-06-01
场景如下:总共100张票,编号1~100,三个窗口售票,售完为止。
Tickets.java 票为单件模式,代码如下:
package Tester; import java.util.ArrayList; import java.util.Collection; import java.util.Iterator; import java.util.List; import java.util.ListIterator; public class Tickets { private Tickets() { ticketNo = 100; logs = new ArrayList<String>(); } private static volatile Tickets instance; private Integer ticketNo; private List<String> logs; public static Tickets getIstance() { // 对象实例化时与否判断(不使用同步代码块,instance不等于null时,直接返回对象,提高运行效率) if (instance == null) { // 同步代码块(对象未初始化时,使用同步代码块,保证多线程访问时对象在第一次创建后,不再重复被创建) synchronized (Tickets.class) { // 未初始化,则初始instance变量 if (instance == null) { instance = new Tickets(); } } } return instance; } //synchronized 线程同步 public synchronized void SellTicket(String Sellor) { if (ticketNo > 0) { AddLog(Sellor, ticketNo); ticketNo--; } } public void PrintLog() { for (String log : logs) { System.out.println(log); } } private void AddLog(String Sellor, int ticketNo) { logs.add("Sellor: " + Sellor + " TicketNo: " + ticketNo--); } }