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:24)

Я проверил, что список или значения в нем не являются нулевыми. Какой правильный подход, когда у вас есть один писатель - несколько читателей. Цель не в том, чтобы иметь синхронизированный список.

1 ответ

Ваш изменчивый тег ничего не значит - это связано с безопасностью потока записываемого объекта. Если вы не хотите сами создавать надлежащие барьеры памяти, вам нужно использовать другой класс, например:

Вместо:

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

Попробуйте использовать:

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

Я предполагаю, что вы используете LinkedList вместо ArrayList, потому что вам нужны методы Deque, а не методы list.

Если вам действительно нужны методы списка вместо методов dequeu, вы можете использовать CopyOnWriteArrayList

В любом случае - вам нужно что-то, что выплевывает слабо непротиворечивый итератор, а не одну из стандартных коллекций java.util, которые все отказываются в своих javadoc-файлах, что они по своей сути не ориентированы на многопотоковую обработку с любым набором читателей и писателей и, таким образом, не подходят для вашего используйте случай без надлежащих барьеров памяти.

Другие вопросы по тегам