我有一个由单个线程修改的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)
我已检查过列表或其中的值是否为空。当你有一个作家 - 多个读者时,正确的方法是什么。目标是不以获得同步列表。
答案 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中都声明它们本质上不是线程安全的,并且读写器混合使用因此,如果没有适当的内存屏障,则不适合您的用例。