package com;

/**
 * @author 冀帅
 * @date 2020/8/1-15:31
 * 使用同步方法来处理继承Thread类的线程安全问题
 * 同步方法使用的锁是this(当前对象),而当前对象有三个,所以若是用继承Runnable的方法处理则还是不安全
 * 所以同步方法前要加static  ---------区别
 *
 * 总结:1.同步方法仍需要同步监视器,只是不需要我们显示声明
 *       2.非静态的同步方法:同步监视器是this(实现方式)
 *          静态(static)同步方法:同步监视器是当前类本身
 */
class MyWindoow extends Thread{
    private static int tickets = 100;
  // private static Object obj =new  Object();
    @Override
    public void run() {
        while (true){
            show();
            //synchronized (obj) {

            //}
        }
    }
     private static synchronized void show(){//同步监视器是当前类:WindowTest4
   // private synchronized void show(){ 同步监视器是this(t1,t2,t3)
        if (tickets > 0) {
            try {
                Thread.sleep(100);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            System.out.println(Thread.currentThread().getName() + ":卖票" + tickets);
            tickets--;
        }
    }
}
public class WindowTest4 {
    public static void main(String[] args) {
        MyWindoow t1 = new MyWindoow();
        MyWindoow t2 = new MyWindoow();
        MyWindoow t3 = new MyWindoow();
        t1.setName("窗口Q");
        t2.setName("窗口W");
        t3.setName("窗口E");
        t1.start();
        t2.start();
        t3.start();



    }


}