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



我有一个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)

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

您的volatile标记没有任何意义——这与可写对象的线程安全性有关。如果你不想自己实现适当的内存屏障,那么你需要使用一个不同的类,比如:

代替:

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

尝试使用:

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

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

如果你真的需要列表方法而不是dequeu方法,你可以使用CopyOnWriteArrayList

不管怎样,你需要一个能吐出弱一致迭代器的东西,而不是一个标准的java.util集合,这些集合在它们的javadocs中都否认,它们与任何读写器的混合都不是线程安全的,因此不适合没有适当内存障碍的用例。

相关内容

  • 没有找到相关文章

最新更新