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--);
    }
}
View Code

相关文章: