Java:如果多个线程试图访问从LinkedList实现的队列而不是ConcurrentLinkedQueue会发生什么?

时间:2015-11-25 18:12:04

标签: java multithreading concurrency

如果多个线程尝试访问从LinkedList而不是ConcurrentLinkedQueue实现的队列,会发生什么?

假设每个线程只使用add()poll()而没有其他函数调用,这两个操作是原子的吗?

如果它们是原子的,那么使用ConcurrentLinkedQueue而不是常规LinkedList实现会有好处吗?

2 个答案:

答案 0 :(得分:1)

未定义。对于多线程使用,常规LinkedList不是原子/安全的。

你可以将它包装在Collections.synchronizedList(LinkedList)中以获得原子操作,但它仍然不同。 ConcurrentLinkedQueue专为在多线程环境中使用而设计为“基于链接节点的无界线程安全队列”。如果您阅读documentation之类的

,您会发现它有不同的做法
  

实现采用有效的非阻塞算法[...]

同步LinkedList锁定每个操作的整个列表。但它也有缺点,如

  

请注意,与大多数集合不同,size方法不是常量操作。

这取决于您的要求,但如果您想要并发队列,则可以非常安全地假设您不应使用LinkedList

答案 1 :(得分:0)

这些操作不是原子的。 查看LinkedList的源代码,您可以看到添加和轮询调用例程,这两个线程在没有同步的情况下在同一个实例上执行时绝对不安全。