Single Thread Execution

該模式是指同一時間內只能有一個線程進入

通過安檢

僅一個乘客可通過安全門,僅需要於FlightSecurity.pass加入synchronized即可完成

@Slf4j
public class FlightSecurity {

    private int count = 0;

    private String boardingPass;
    private String idCard;

    public synchronized void  pass(Passenger passenger) {
        try {
            count++;
            this.idCard = passenger.getIdCard();
            TimeUnit.SECONDS.sleep(1);
            this.boardingPass=passenger.getBoardingPass();
            this.check();
        } catch (InterruptedException e) {
            throw new RuntimeException(e);
        } finally {
            count--;
            log.info("count:{} passenger:{}", count, passenger);

        }

    }

    private void check() {
        if (!StringUtils.equals(boardingPass,idCard)) {
            throw new RuntimeException("no same boardingPass:"+boardingPass+",idCard:"+idCard);
        }
    }

@ToString
public class Passenger extends Thread {
    private String boardingPass;
    private String idCard;


    private FlightSecurity flightSecurity;

    public Passenger(String name, String boardingPass, String idCard, FlightSecurity flightSecurity) {
        super(name);
        this.boardingPass = boardingPass;
        this.idCard = idCard;
        this.flightSecurity = flightSecurity;
    }

    @Override
    public void run() {
        flightSecurity.pass(this);
    }


    public String getBoardingPass() {
        return boardingPass;
    }

    public String getIdCard() {
        return idCard;
    }
}

Last updated

Was this helpful?