1.什么是ConcurrentLinkedQueue 队列?
首先看一看的关系图:
它是一个使用CAS 算法实现的非阻塞线程安全的FIFO队列,来保证元素的一致性。因为是使用NODE 节点实现的队列,所在在获取长度的时候,会遍历一遍此队列,会比较耗时
我们在使用判断元素是否为空的时候,最好不要用size() 来做判断,可以用isEmpty()方法来判断。ps:因为此类实现了Collection 接口,所以会有size() 和isEmpty() 方法。
2.最后体验一下队列中使用size()的后果。我往队列里面放入10000000 我使用ArrayList 的size() 做比较。测试有时候会相差1秒多,随着数据的增大会更加明显,
size 队列遍历的代码如下:所以在多线程并发的情况下,最后不用size() 。
我写了一个例子来比较队列和数组使用size() 的区别,请看下面的代码:
实体bean:
主线程方法:
测试结果如下: