相同:
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) |