import java.util.concurrent.locks.Condition;
import java.util.concurrent.locks.ReentrantLock;
public class Buffer {
private final ReentrantLock lock = new ReentrantLock();
private final Condition notFull = lock.newCondition();
private final Condition notEmpty = lock.newCondition();
private final Object[] items;
private int putIndex = 0;
private int takeIndex = 0;
private int count = 0;
public Buffer(int size) {
this.items = new Object[size];
}
public void put(Object item) throws InterruptedException {
lock.lock();
try {
while (count == items.length) {
notFull.await(); // 缓冲区满了,等待空间
}
items[putIndex] = item;
if (++putIndex == items.length) {
putIndex = 0;
}
++count;
notEmpty.signal(); // 通知消费者缓冲区中有数据了
} finally {
lock.unlock();
}
}
public Object take() throws InterruptedException {
lock.lock();
try {
while (count == 0) {
notEmpty.await(); // 缓冲区空了,等待数据
}
Object item = items[takeIndex];
if (++takeIndex == items.length) {
takeIndex = 0;
}
--count;
notFull.signal(); // 通知生产者缓冲区有空间了
return item;
} finally {
lock.unlock();
}
}
}
理解:读一个Condition条件,写一个Condition条件,类似于古时候没有电话,两个国家通信,每个国家都有自己的信使,这样比一个信使效率要高的多。读和写始终还是互斥的,只是cpu时间片可能分配不同,会出现错觉,两个线程同时获取到锁。