首页   快速返回

AQS同步队列与条件队列     所属分类 java
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包冲突解决实例