如果面试问道
并发包中的ConcurrentLinkedQueue和LinkedBlockingQueue有什么区别?
你会如何回答呢?
我的回答
有时候我们把并发包下面的所有容器都习惯叫作并发容器,但是严格来讲,类似 ConcurrentLinkedQueue 这种“Concurrent*”容器,才是真正代表并发。
关于问题中它们的区别:
-
Concurrent 类型基于 lock-free,在常见的多线程访问场景,一般可以提供较高吞吐量。
-
而 LinkedBlockingQueue 内部则是基于锁,并提供了 BlockingQueue 的等待性方法。
不知道你有没有注意到,java.util.concurrent 包提供的容器(Queue、List、Set)、Map,从命名上可以大概区分为 Concurrent*、CopyOnWrite和 Blocking等三类,同样是线程安全容器,可以简单认为:
-
Concurrent 类型没有类似 CopyOnWrite 之类容器相对较重的修改开销。
-
但是,凡事都是有代价的,Concurrent 往往提供了较低的遍历一致性。你可以这样理解所谓