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-файлах, что они по своей сути не ориентированы на многопотоковую обработку с любым набором читателей и писателей и, таким образом, не подходят для вашего используйте случай без надлежащих барьеров памяти.