/**
abc三个售票窗口,售50张票。

需求:可以做到同时销售,且不能卖重叠的,以及不能超过50

线程安全的原因:
当多条语句操作同一个线程共享数据时,一个线程对多语句只执行了一部分,没有执行完,另一个线程
就来执行语句,导致出现共享数据的错误。

解决方法:
对多条操作共享数据的语句,只能让一个线程执行,让其他线程不能执行

同步代码块
synchronized(对象){
    同步代码块;
}

对象如同锁,持有锁的线程可以在同步中执行
没有持有锁的线程即使获得CPU的执行器,也无法执行。

同步前提:
1.多线程的代码块才需要同步,即run里的代码才需要加同步。对共享数据加同步
2.必须是多个线程使用同一个锁,才需要同步

好处:提高多线程的安全问题
弊端:多个线程需要判断锁,较为消耗资源

如何找多线程的问题:
1.明确哪些代码是多线程运行代码
2.明确共享数据
3.明确多线程中哪些语句操作共享数据的
*/
class Tickt implements Runnable //extends Thread{
{
    private int tickt=10000;
    Object obj = new Object();
    
    public void run(){                
        while(true){ 
            synchronized(obj){    
                if(tickt>0){         
                    //try{Thread.sleep(100);}catch(InterruptedException e){}
                    System.out.println(Thread.currentThread().getName()+"售票员卖出:"+ tickt-- +"号票"); 
                }                 
          }
      }            
    }    
}


class SaleTickt{
    public static void main(String[]args){
        Tickt a = new Tickt();
        Thread t1 = new Thread(a);
        Thread t2 = new Thread(a);
        Thread t3 = new Thread(a);
        Thread t4 = new Thread(a);
        t1.start();
        t2.start();
        t3.start();
        t4.start();
    }
}