如果多个线程尝试访问从LinkedList
而不是ConcurrentLinkedQueue
实现的队列,会发生什么?
假设每个线程只使用add()
和poll()
而没有其他函数调用,这两个操作是原子的吗?
如果它们是原子的,那么使用ConcurrentLinkedQueue
而不是常规LinkedList
实现会有好处吗?
答案 0 :(得分:1)
未定义。对于多线程使用,常规LinkedList
不是原子/安全的。
你可以将它包装在Collections.synchronizedList(LinkedList)
中以获得原子操作,但它仍然不同。 ConcurrentLinkedQueue
专为在多线程环境中使用而设计为“基于链接节点的无界线程安全队列”。如果您阅读documentation之类的
实现采用有效的非阻塞算法[...]
同步LinkedList
锁定每个操作的整个列表。但它也有缺点,如
请注意,与大多数集合不同,size方法不是常量操作。
这取决于您的要求,但如果您想要并发队列,则可以非常安全地假设您不应使用LinkedList
。
答案 1 :(得分:0)
这些操作不是原子的。 查看LinkedList的源代码,您可以看到添加和轮询调用例程,这两个线程在没有同步的情况下在同一个实例上执行时绝对不安全。