阻塞队列LinkedBlockingQueue和ArrayBlockingQueue的异同

相同:

1、都实现了BlockingQueue接口,都是可阻塞的队列。

2、内部都是使用ReentrantLock和Condition来保证生产和消费的同步。

3、当队列为空,消费者线程被阻塞;当队列装满,生产者线程被阻塞。

4、使用Condition的方法来同步和通信:await()和signal()。


不同:

1、锁机制不同

LinkedBlockingQueue中的锁是分离的,生产者的锁PutLock,消费者的锁takeLock。

ArrayBlockingQueue生产者和消费者使用的都是同一把锁。

2、他们的底层实现机制不同

LinkedBlockingQueue内部维护的是一个链表。

ArrayBlockingQueue内部维护的是一个数组。

3、构造时候的区别

LinkedBlockingQueue有默认的容量大小为:Integer.MAX_VALUE,当然也可以传入指定的容量大小。

ArrayBlockingQueue在初始化的时候,必须传入一个容量大小的值。


方法区别:

抛异常返回true或false阻塞带时间的阻塞
插入add(o)offer(o)put(o)offer(o,timeout,timeunit)
移除remove(o)poll()take()poll(timeout,timeunit)