多线程-synchronized锁

package 多线程.synchronized锁;
/*、
*
* 
*
* */
public class Sale implements Runnable {
    private int m = 10;
    @Override
    public void run() {
        //保证每一个线程都必须完成,其他线程才能抢  使用同步锁 出现共享变量都要加锁  多个线程必须持有同一个锁

        while (true) {
            synchronized (this) {  //出现共享变量都要加锁  多个线程必须持有同一个锁  synchronized同步
                if(m > 0) {
                    System.out.println(Thread.currentThread().getName() + "卖票---" + (m--) + "");
                }else {
                    break;
                }
            }
            try {
                Thread.sleep(100);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    }
}
package 多线程.synchronized锁;
/*、
*
* //同步方法
*
* */
public class Sale2 implements Runnable {
    private int m = 10;
//     Object obj = new Object();
    boolean run=true;
    @Override
    public void run() {
        //保证每一个线程都必须完成,其他线程才能抢  使用同步锁 出现共享变量都要加锁  多个线程必须持有同一个锁

        while (run) {
            this.sale();
            try {
                Thread.sleep(100);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    }

    public  synchronized void sale(){
        if(m > 0) {
            System.out.println(Thread.currentThread().getName() + "卖票---" + (m--) + "");
        }else {
//            System.exit(-1); //关闭jvm虚拟机
            run =false;
        }
    }
}
package 多线程.synchronized锁;

public class Demo02 {
    public static void main(String[] args) {
        Sale2 sale = new Sale2();

        Thread t1 =new Thread(sale,"窗口1");
        Thread t2 =new Thread(sale,"窗口2");
        Thread t3 =new Thread(sale,"窗口3");

        t1.start();
        t2.start();
        t3.start();
    }
}

结果:

窗口1卖票---10张
窗口2卖票---9张
窗口3卖票---8张
窗口1卖票---7张
窗口3卖票---6张
窗口2卖票---5张
窗口2卖票---4张
窗口1卖票---3张
窗口3卖票---2张
窗口2卖票---1张

 

猜你喜欢

转载自www.cnblogs.com/houtian2333/p/10702644.html