多线程synchronized


好处:
更加的安全,此处代码不加synchronized就会导致(因为有sleep)出现0或者负票,有堵塞,假如线程一开始最后一张1号票,但是堵塞了,线程二执行发现tickets大于零两个都执行最后就导致有零或者负票
坏处:
程序变慢了,再synchronized代码块相当于是单线程,因为要排队,外面是多线程

package homework;

class SellTickets implements Runnable{
    private int tickets=100;
    Object o=new Object();
    @Override
    public void run(){
       while(true){//synchronized
            synchronized(o) {/*锁,必须共用一个锁,锁的对象可以任意,此处是Object类,也可其他类,但是唯一的要求就是必须是共用同一个锁,但是不能把Object的定义放入while里面,这样就不是同一个锁*/
               if (tickets > 0) {
                   try {
                       Thread.sleep(100);
                   } catch (InterruptedException e) {
                       e.printStackTrace();
                   }
                   System.out.println(Thread.currentThread().getName() + "购票成功:" + tickets--);
               } else
                   break;
           }
        }
    }
}



    public class test4 {
    public static void main(String[] args) {
        SellTickets s=new SellTickets();
        Thread w1=new Thread(s);
        Thread w2=new Thread(s);
        Thread w3=new Thread(s);
        w1.setName("窗口一:");
        w2.setName("窗口二:");
        w3.setName("窗口三:");
        w1.start();
        w2.start();
        w3.start();
    }

}


`````