生產者消費者 synchronized 互斥鎖 和lock同步鎖
阿新 • • 發佈:2019-01-12
1 synchronized
package com.gc.test; /** * 生產者消費者問題 * 1 店員 * 2 生產者 * 3 消費者 * @author jiji * */ public class ProducetAndConsumerTest { public static void main(String[] args) { ShopPerson shop = new ShopPerson(); Product product = new Product(shop); Consumer cum = new Consumer(shop); new Thread(cum,"消費者1").start();; new Thread(product,"生產者1").start();; new Thread(cum,"消費者2").start();; new Thread(product,"生產者2").start();; } } /** * 店員 * @author jiji * */ class ShopPerson{ private Integer shopNum=0; //初始商品數量為0 //**賣貨 public synchronized void getShop(){ try{ while(shopNum<=0){ System.out.println("-----------缺貨"); this.wait(); } System.out.println(Thread.currentThread().getName()+"消費:"+ --shopNum); this.notifyAll(); }catch(Exception e){ } } public synchronized void productShop(){ try{ while(shopNum>=10){ System.out.println("-----------貨物滿了"); this.wait(); } System.out.println(Thread.currentThread().getName()+":"+ ++shopNum); this.notifyAll(); }catch(Exception e){ } } } class Product implements Runnable{ private ShopPerson shop; public Product(ShopPerson shop) { this.shop = shop; } @Override public void run() { for (int i=0;i<20;i++) { shop.productShop(); } } } class Consumer implements Runnable{ private ShopPerson shop; public Consumer(ShopPerson shop) { this.shop = shop; } @Override public void run() { for (int i=0;i<20;i++) { shop.getShop(); } } }
2 lock方式
package com.gc.test; import java.util.concurrent.locks.Condition; import java.util.concurrent.locks.Lock; import java.util.concurrent.locks.ReentrantLock; /** * 生產者消費者問題 * 1 店員 * 2 生產者 * 3 消費者 * @author jiji * */ public class ProducetAndConsumerLock { public static void main(String[] args) { ShopPerson1 shop = new ShopPerson1(); Product1 product = new Product1(shop); Consumer1 cum = new Consumer1(shop); new Thread(product,"生產者1").start();; new Thread(cum,"消費者1").start();; new Thread(product,"生產者2").start();; new Thread(cum,"消費者2").start();; } } /** * 店員 * @author jiji * */ class ShopPerson1{ private Integer shopNum=0; //初始商品數量為0 private Lock lock = new ReentrantLock(); private Condition condition = lock.newCondition(); //**賣貨 public void getShop(){ lock.lock(); try{ while(shopNum<=0){ System.out.println("-----------缺貨"); condition.await(); } System.out.println(Thread.currentThread().getName()+"消費:"+ --shopNum); condition.signalAll(); }catch(Exception e){ }finally { lock.unlock(); } } public void productShop(){ lock.lock(); try{ while(shopNum>=10){ System.out.println("-----------貨物滿了"); condition.await(); } System.out.println(Thread.currentThread().getName()+":"+ ++shopNum); condition.signalAll(); }catch(Exception e){ }finally { lock.unlock(); } } } class Product1 implements Runnable{ private ShopPerson1 shop; public Product1(ShopPerson1 shop) { this.shop = shop; } @Override public void run() { for (int i=0;i<20;i++) { shop.productShop(); } } } class Consumer1 implements Runnable{ private ShopPerson1 shop; public Consumer1(ShopPerson1 shop) { this.shop = shop; } @Override public void run() { for (int i=0;i<20;i++) { shop.getShop(); } } }