package com.sf.javase.thread.sync;

import lombok.SneakyThrows;

// 解决买票的超卖问题
public class Ticket {

    public static void main(String[] args) {
        Window window = new Window();
        // 三个线程使用同一个window对象
        // 一个window对象 只有一个lock对象 所以使用的是同一把锁
        new Thread(window, "t1").start();
        new Thread(window, "t2").start();
        new Thread(window, "t3").start();
    }

    private static class Window implements Runnable {

        private int ticketsNum = 100;
        // 创建一个对象 用对象来加锁
        Object lock = new Object();

        // lombok提供了一个处理异常的注解
        @SneakyThrows
        @Override
        public void run() {
            while (true) {
                // 同步代码块
                synchronized (lock) {
                    if (ticketsNum > 0) {
                        Thread.sleep(100);
                        System.out.println(Thread.currentThread().getName() + " : " + ticketsNum--);
                    }
                }
            }
        }
    }
}