我有一个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中都否认,它们与任何读写器的混合都不是线程安全的,因此不适合没有适当内存障碍的用例。