其他分享
首页 > 其他分享> > 多线程的同步

多线程的同步

作者:互联网

案件引入: 电影院 4个窗口 售卖50张电影票

 

package com.example02;
public class Ticket01 extends Thread {   
/* 模拟火车站窗口售票场景: 4个窗口发售 某次列车的50张车票
*可以将50张车票 看作是共享资源
*4个窗口,则需要创建4个线程
*/
    private int tickets=50;
    private String name;
    
    public Ticket01(String name) {
        this.name=name;
    }
    public void run() {
        
        while(true) {                      //通过死循环语句打印语句
            if(tickets>0) {       
                //while循环依次对ticket属性进行自减操作,以模拟售票的过程,直到ticket属性值为0时,跳出循环
                System.out.println(name+"正在发售第"+  tickets--  +"张票");  
            }else {
                break;
            }
        }
    }
    public static void main(String[] args) {   // 定义4个线程对象,代表4个售票窗口
        
        Ticket01 t1 = new Ticket01("窗口1");
        Ticket01 t2 = new Ticket01("窗口2");
        Ticket01 t3 = new Ticket01("窗口3");
        Ticket01 t4 = new Ticket01("窗口4");
        t1.start();                             //启动4个线程
        t2.start();
        t3.start();
        t4.start();
    }

}

结果

 

窗口2正在发售第50张票
窗口1正在发售第50张票
窗口1正在发售第49张票
窗口1正在发售第48张票
窗口1正在发售第47张票
窗口1正在发售第46张票
窗口1正在发售第45张票
窗口1正在发售第44张票
窗口1正在发售第43张票
窗口1正在发售第42张票
窗口1正在发售第41张票
窗口1正在发售第40张票
窗口1正在发售第39张票
窗口1正在发售第38张票
窗口1正在发售第37张票
窗口1正在发售第36张票
窗口1正在发售第35张票
窗口1正在发售第34张票
窗口1正在发售第33张票
窗口1正在发售第32张票
窗口1正在发售第31张票
窗口1正在发售第30张票
窗口1正在发售第29张票
窗口1正在发售第28张票
窗口1正在发售第27张票
窗口1正在发售第26张票
窗口1正在发售第25张票
窗口1正在发售第24张票
窗口1正在发售第23张票
窗口1正在发售第22张票
窗口1正在发售第21张票
窗口1正在发售第20张票
窗口1正在发售第19张票
窗口1正在发售第18张票
窗口1正在发售第17张票
窗口1正在发售第16张票
窗口1正在发售第15张票
窗口1正在发售第14张票
窗口1正在发售第13张票
窗口1正在发售第12张票
窗口1正在发售第11张票
窗口1正在发售第10张票
窗口1正在发售第9张票
窗口1正在发售第8张票
窗口1正在发售第7张票
窗口1正在发售第6张票
窗口1正在发售第5张票
窗口1正在发售第4张票
窗口1正在发售第3张票
窗口1正在发售第2张票
窗口1正在发售第1张票
窗口2正在发售第49张票
窗口2正在发售第48张票
窗口2正在发售第47张票
窗口2正在发售第46张票
窗口3正在发售第50张票
窗口2正在发售第45张票
窗口2正在发售第44张票
窗口2正在发售第43张票
窗口2正在发售第42张票
窗口2正在发售第41张票
窗口2正在发售第40张票
窗口2正在发售第39张票
窗口2正在发售第38张票
窗口2正在发售第37张票
窗口2正在发售第36张票
窗口2正在发售第35张票
窗口2正在发售第34张票
窗口2正在发售第33张票
窗口2正在发售第32张票
窗口2正在发售第31张票
窗口2正在发售第30张票
窗口2正在发售第29张票
窗口2正在发售第28张票
窗口2正在发售第27张票
窗口2正在发售第26张票
窗口2正在发售第25张票
窗口2正在发售第24张票
窗口2正在发售第23张票
窗口2正在发售第22张票
窗口2正在发售第21张票
窗口2正在发售第20张票
窗口2正在发售第19张票
窗口2正在发售第18张票
窗口2正在发售第17张票
窗口2正在发售第16张票
窗口2正在发售第15张票
窗口2正在发售第14张票
窗口2正在发售第13张票
窗口2正在发售第12张票
窗口2正在发售第11张票
窗口2正在发售第10张票
窗口3正在发售第49张票
窗口2正在发售第9张票
窗口2正在发售第8张票
窗口2正在发售第7张票
窗口2正在发售第6张票
窗口2正在发售第5张票
窗口2正在发售第4张票
窗口2正在发售第3张票
窗口2正在发售第2张票
窗口2正在发售第1张票
窗口3正在发售第48张票
窗口3正在发售第47张票
窗口3正在发售第46张票
窗口3正在发售第45张票
窗口3正在发售第44张票
窗口3正在发售第43张票
窗口3正在发售第42张票
窗口3正在发售第41张票
窗口3正在发售第40张票
窗口3正在发售第39张票
窗口3正在发售第38张票
窗口3正在发售第37张票
窗口3正在发售第36张票
窗口3正在发售第35张票
窗口3正在发售第34张票
窗口3正在发售第33张票
窗口3正在发售第32张票
窗口3正在发售第31张票
窗口3正在发售第30张票
窗口4正在发售第50张票
窗口3正在发售第29张票
窗口4正在发售第49张票
窗口3正在发售第28张票
窗口4正在发售第48张票
窗口3正在发售第27张票
窗口4正在发售第47张票
窗口3正在发售第26张票
窗口4正在发售第46张票
窗口3正在发售第25张票
窗口4正在发售第45张票
窗口3正在发售第24张票
窗口4正在发售第44张票
窗口3正在发售第23张票
窗口4正在发售第43张票
窗口3正在发售第22张票
窗口4正在发售第42张票
窗口3正在发售第21张票
窗口4正在发售第41张票
窗口3正在发售第20张票
窗口4正在发售第40张票
窗口3正在发售第19张票
窗口4正在发售第39张票
窗口3正在发售第18张票
窗口4正在发售第38张票
窗口3正在发售第17张票
窗口4正在发售第37张票
窗口3正在发售第16张票
窗口4正在发售第36张票
窗口3正在发售第15张票
窗口4正在发售第35张票
窗口3正在发售第14张票
窗口4正在发售第34张票
窗口3正在发售第13张票
窗口4正在发售第33张票
窗口3正在发售第12张票
窗口4正在发售第32张票
窗口3正在发售第11张票
窗口4正在发售第31张票
窗口3正在发售第10张票
窗口4正在发售第30张票
窗口3正在发售第9张票
窗口4正在发售第29张票
窗口4正在发售第28张票
窗口4正在发售第27张票
窗口4正在发售第26张票
窗口4正在发售第25张票
窗口4正在发售第24张票
窗口4正在发售第23张票
窗口4正在发售第22张票
窗口4正在发售第21张票
窗口4正在发售第20张票
窗口4正在发售第19张票
窗口4正在发售第18张票
窗口4正在发售第17张票
窗口4正在发售第16张票
窗口4正在发售第15张票
窗口4正在发售第14张票
窗口3正在发售第8张票
窗口4正在发售第13张票
窗口4正在发售第12张票
窗口4正在发售第11张票
窗口4正在发售第10张票
窗口4正在发售第9张票
窗口3正在发售第7张票
窗口4正在发售第8张票
窗口3正在发售第6张票
窗口4正在发售第7张票
窗口3正在发售第5张票
窗口4正在发售第6张票
窗口3正在发售第4张票
窗口4正在发售第5张票
窗口3正在发售第3张票
窗口4正在发售第4张票
窗口3正在发售第2张票
窗口3正在发售第1张票
窗口4正在发售第3张票
窗口4正在发售第2张票
窗口4正在发售第1张票

 

 出现问题:

 总共50张票,但是结果显示:每个窗口售卖了50张票,一共售出200张票!!!!

 

改进代码:

package com.example02;
public class Ticket02 implements Runnable {   
    private int tickets=50;
     
    public void run() {
        
        while(true) {                                           //通过死循环语句打印语句
            if(tickets>0) {       
                
                String name=Thread.currentThread().getName();   //获取当前线程的名称
                
                //while循环依次对ticket属性进行自减操作,以模拟售票的过程,直到ticket属性值为0时,跳出循环
                System.out.println(name+"正在发售第"+  tickets--  +"张票");  
                
            }else {
                break;
            }
        }
    }
    public static void main(String[] args) {  
        
        //创建线程任务
        Ticket02 ticket02 = new Ticket02();
        // 定义4个线程对象,代表4个售票窗口
        Thread t1 = new Thread(ticket02,"窗口1");
        Thread t2 = new Thread(ticket02,"窗口2");
        Thread t3 = new Thread(ticket02,"窗口3");
        Thread t4 = new Thread(ticket02,"窗口4");
        //开启四个线程
        t1.start();
        t2.start();
        t3.start();
        t4.start();
        
         
    }

}

 

 

 结果:

窗口1正在发售第50张票
窗口3正在发售第49张票
窗口3正在发售第48张票
窗口3正在发售第47张票
窗口3正在发售第46张票
窗口3正在发售第45张票
窗口3正在发售第43张票
窗口3正在发售第42张票
窗口3正在发售第41张票
窗口3正在发售第40张票
窗口3正在发售第39张票
窗口3正在发售第38张票
窗口3正在发售第37张票
窗口3正在发售第36张票
窗口3正在发售第35张票
窗口3正在发售第34张票
窗口3正在发售第33张票
窗口1正在发售第44张票
窗口1正在发售第29张票
窗口1正在发售第28张票
窗口1正在发售第27张票
窗口1正在发售第26张票
窗口1正在发售第25张票
窗口1正在发售第24张票
窗口1正在发售第23张票
窗口1正在发售第22张票
窗口1正在发售第21张票
窗口1正在发售第20张票
窗口1正在发售第19张票
窗口4正在发售第30张票
窗口4正在发售第17张票
窗口4正在发售第16张票
窗口4正在发售第15张票
窗口4正在发售第14张票
窗口4正在发售第13张票
窗口4正在发售第12张票
窗口4正在发售第11张票
窗口4正在发售第10张票
窗口4正在发售第9张票
窗口4正在发售第8张票
窗口4正在发售第7张票
窗口4正在发售第6张票
窗口4正在发售第5张票
窗口4正在发售第4张票
窗口4正在发售第3张票
窗口4正在发售第2张票
窗口4正在发售第1张票
窗口3正在发售第31张票
窗口2正在发售第32张票
窗口1正在发售第18张票

 

 

解决了问题:4个窗口共买了50张电影票


 

线程安全问题!

 

标签:正在,窗口,Thread,张票,50,同步,多线程,发售
来源: https://www.cnblogs.com/penguin1024/p/11781521.html