package com.kaibing.design; import java.util.concurrent.locks.Condition; import java.util.concurrent.locks.Lock; import java.util.concurrent.locks.ReentrantLock; public class ProductorAndCustomerLock { public static void main(String[] args) { Clerk clerk = new Clerk(); Productor productor = new Productor(clerk); Customer customer = new Customer(clerk); new Thread(productor, "生产者A:").start(); new Thread(customer, "消费者A:").start(); new Thread(productor, "生产者B:").start(); new Thread(customer, "消费者B:").start(); } static class Clerk {//店员类 private int product = 0; private Lock lock = new ReentrantLock(); private Condition condition = lock.newCondition(); public void get() {//进货 lock.lock();//加锁 try{ while (product >= 1) {//容量为1 System.out.println("库存已满"); try { condition.await();//等待:为了避免虚假唤醒,wait在循环中使用 } catch (InterruptedException e) { e.printStackTrace(); } } //进货 System.out.println("库存" + ++product); condition.signalAll();//唤醒 }finally{ lock.unlock();//释放锁 } } public void sale() {//卖货 lock.lock();//加锁 try{ while (product <= 0) { System.out.println("库存已空"); try { condition.await(); } catch (InterruptedException e) { e.printStackTrace(); } } System.out.println("卖货" + --product); condition.signalAll(); }finally { lock.unlock();//释放锁 } } } static class Productor implements Runnable { private Clerk clerk; public Productor(Clerk clerk) { this.clerk = clerk; } @Override public void run() { for (int i = 0; i < 10; i++) { try { Thread.sleep(200); } catch (InterruptedException e) { e.printStackTrace(); } clerk.get();//消费货物 } } } static class Customer implements Runnable { private Clerk clerk; public Customer(Clerk clerk) { this.clerk = clerk; } @Override public void run() { for (int i = 0; i < 10; i++) { clerk.sale();//消费货物 } } } }