ArrayBlockingQueue和LinkedBlockingQueue的区别

两者都是常用的有界阻塞队列,不同点如下:

1、ArrayBlockingQueue是数组结构的(final Object[] items;),LinkedBlockingQueue是链表结构的(private transient Node<E> head;)。

2、ArrayBlockingQueue直接保存对象,LinkedBlockingQueue需要把对象转为Node类型再保存。

3、ArrayBlockingQueue读写共用一把锁,不能做到同时(任意时刻)读写,宏观上看是读写交替进行的:

             /** Main lock guarding all access */
            final ReentrantLock lock;
            /** Condition for waiting takes */
            private final Condition notEmpty;
            /** Condition for waiting puts */
            private final Condition notFull;

            lock = new ReentrantLock(fair);
            notEmpty = lock.newCondition();
            notFull =  lock.newCondition();

        LinkedBlockingQueue读写锁是分离的,只要链表不空或没有达到容量上限就能同时读写:

             private final ReentrantLock takeLock = new ReentrantLock();

              /** Wait queue for waiting takes */
             private final Condition notEmpty = takeLock.newCondition();

            /** Lock held by put, offer, etc */
            private final ReentrantLock putLock = new ReentrantLock();

            /** Wait queue for waiting puts */
            private final Condition notFull = putLock.newCondition();

4、ArrayBlockingQueue使用时必须指定容量,LinkedBlockingQueue可以不指定容量,此时容量为Integer.MAX_VALUE

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值