ArrayBlockingQueue VS LinkedBlockingQueue
区别
1)锁的使用上的不同。ArrayBlockingQueue使用一把全局锁,无论是放入还是取出,都使用一把锁,读和写会互相影响。对于LinkedBlockingQueue来说,它使用两把锁,一把take锁,一把put锁,存取互不影响。
从这个角度来说,LinkedBlockingQueue更加适合高并发,有更高的吞吐量,能够在单位时间内处理更多的请求。
2)底层存储结构上不同。ArrayBlockingQueue使用的是Object[] items
存储的元素,而LinkedBlockingQueue使用的是Node
节点进行元素的存储。
如果数据量非常大,随着数据量的增长,需要构建的Node节点数量就会越多,Node节点数量代表的是对象的数量,一旦有这么多的对象产生,就会有产生对象的JVM的消耗,比如使用完成后的垃圾回收、next指针问题。ArrayBlockingQueue使用的是数组存储,内存空间连续,不需要额外构造Node节点,
3)队列长度的区别。如果要创建ArrayBlockingQueue就需要严格指定Queue的大小,即在使用Queue之前就需要开辟好对应的内存空间。而LinkedBlockQueue不强制指定大小。因为每次插入一个新节点,都会创建一个Node对象,都会开启一片新的内存空间。
效率问题?
- 如果有条件,选择两个队列时进行压测
- 如果写多读少,建议使用ArrayBlockingQueue
- 如果读多写少,建议使用LinkedBlockingQueue
- 如果Queue定长,建议使用ArrayBlockingQueue
- 如果Queue中的数量会很大,建议使用ArrayBlockingQueue
没有办法界定性能问题。因为永远无法知道,开辟内存空间的消耗,创建 Node对象的消耗,回收Node对象的消耗,和ArrayBlockingQueue的单锁的消耗谁大谁小。