LinkedList.addAll在多线程应用程序中触发空指针异常

时间:2015-02-26 10:40:22

标签: java multithreading list synchronization lock-free

我有一个由单个线程修改的LinkedList。但是有许多线程在阅读它。

protected volatile LinkedList<V> list = new LinkedList<V>();

我需要在某个时候检索此列表。所以,当我这样做时,

List<V> retList = new LinkedList<V>();
retList.addAll(list);
return Collections.unmodifiableList(list);

我收到以下异常

  

显示java.lang.NullPointerException       在java.util.LinkedList.toArray(LinkedList.java:866)       在java.util.LinkedList.addAll(LinkedList.java:269)       在java.util.LinkedList.addAll(LinkedList.java:247)

我已检查过列表或其中的值是否为空。当你有一个作家 - 多个读者时,正确的方法是什么。目标是以获得同步列表。

1 个答案:

答案 0 :(得分:0)

您的volatile标签没有任何意义-这与可写对象的线程安全有关。如果您不想自己实现适当的内存障碍,则需要使用其他类,例如:

代替:

protected volatile LinkedList<V> list = new LinkedList<V>();

尝试使用:

protected Deque<V> list = new [LinkedBlockingDeque][1]<V>();

我假设您使用LinkedList而不是ArrayList,因为您需要Deque方法而不是list方法。

如果您确实需要列表方法而不是出队方法,则可以使用CopyOnWriteArrayList

无论如何-您需要使用weakly consistent迭代器,而不是标准java.util集合之一,而这些集合在其javadocs中都声明它们本质上不是线程安全的,并且读写器混合使用因此,如果没有适当的内存屏障,则不适合您的用例。