AQS同步队列与条件队列
所属分类 java
浏览量 1474
java.util.concurrent
AbstractQueuedSynchronizer
等待队列 CLH(Craig, Landin, and Hagersten)
同步队列
sync queue
当前线程获取同步状态失败后,AQS将线程构建成一个节点,将其加入同步队列队尾
通过signal或signalAll将条件队列中的节点转移到同步队列 (由条件队列转化为同步队列)
条件队列
condition queue
Condition
生产者-消费者
当前线程 位于同步队列队头,调用await方法进入阻塞(从同步队列转到条件队列)
调用 signal方法,从条件队列中取出第一个节点,加入同步队列,等待获取资源
import java.util.concurrent.locks.Condition;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;
class BoundedBuffer {
final Lock lock = new ReentrantLock();
// condition 由 lock 创建
final Condition notFull = lock.newCondition();
final Condition notEmpty = lock.newCondition();
final Object[] items = new Object[100];
int putptr, takeptr, count;
public void put(Object x) throws InterruptedException {
lock.lock();
try {
while (count == items.length)
// 队列已满,等待
notFull.await();
items[putptr] = x;
if (++putptr == items.length) putptr = 0;
++count;
// 生产成功,队列非空,发消息给消费者
notEmpty.signal();
} finally {
lock.unlock();
}
}
public Object take() throws InterruptedException {
lock.lock();
try {
while (count == 0)
// 队列为空,等待
notEmpty.await();
Object x = items[takeptr];
if (++takeptr == items.length) takeptr = 0;
--count;
// 消费,队列非满,发消息给生产者
notFull.signal();
return x;
} finally {
lock.unlock();
}
}
}
上一篇
下一篇
java对象访问方式
btrace使用简介
为什么开发一个操作系统那么难
公平锁与非公平锁的关键区别
自定义注解实例
springboot应用jar包冲突解决实例