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();//消费货物
}
}
}
}