sync结合wait和notify可以实现等待/通知机制。而Reentrantlock是借助Condition接口,利用它来实现多路通知功能。
一个lock对象中,可以创建多个condition对象,线程对象可以注册在指定的condition上,从而可以有选择性的进行通知。在线程调度上更加灵活。
下面是一个Reentrantlock结合condition接口实现阻塞队列的demo。阻塞队列需要满足下面两个特点。
1、入队和出队线程安全
2、当队列满时,入队线程会被阻塞,当队列为空,出队线程会被阻塞。
import java.util.LinkedList;
import java.util.concurrent.locks.Condition;
import java.util.concurrent.locks.ReentrantLock;
public class MyBlockingQueue<E> {
int size;//阻塞队列最大容量
ReentrantLock lock = new ReentrantLock();
LinkedList<E> list=new LinkedList<>();//队列底层实现
Condition notFull = lock.newCondition();//队列满时的等待条件
Condition notEmpty = lock.newCondition();//队列空时的等待条件
public MyBlockingQueue(int size) {
this.size = size;
}
public void enqueue(E e) throws InterruptedException {
lock.lock();
try {
whi