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张