【JAVA】阻塞队列如何实现?分析JDK 阻塞队列源码实现

    xiaoxiao2022-06-27  244

    阻塞队列,顾名思义,在队列操作时有阻塞机制,防止出现数据不一致,这里只分析两个API的操作源代码

    offer(E e)

    生产者,生产元素

    1、加锁,ReentrantLock

    加锁保证了不会同时有多个生产者来生产元素,达到阻塞,否则数据错误乱

    2、判断当前队列里的元素数count,和队列容量capacity比较

    判断是否可以往里面生产元素

    3、数据入队

    4、计数器++

    5、没满,唤醒notFull阻塞线程,可以继续放元素了

    6、释放lock,其它线程可以继续调用offer了

    7、唤醒notEmpty阻塞线程,消费元素线程

    count==0的条件判断做了一个严格校验,防止元素空浪费一次唤醒操作

     

    take()

    1、加锁,takeLock,消费锁

    2、计数器为0,说明队列空,notEmpty阻塞所有的消费操作

    3、消费元素,计数器--

    4、计数器判断还有元素,notEmpty唤醒所有消费操作

    5、释放锁,takeLock

    6、消费的时候,生产操作一直在进行

    判断是否达到容量上限边界,等于容量,还可以继续生产,唤醒生产线程

     

    阻塞队列实现步骤:

    1、生产消费同步加锁,进行阻塞

    2、生产和消费完判断队列元素个数,唤醒对应的生产消费线程

     

     


    最新回复(0)