Из Javadoc ArrayList
:
Обратите внимание, что эта реализация не синхронизирована .Если несколько потоков обращаются к экземпляру ArrayList одновременно, и хотя бы один из потоков структурно изменяет список, он должен быть внешне синхронизирован.
Вы добавляете элементы из нескольких потоков, но не синхронизируете их внешне,Таким образом, вы можете увидеть неопределенное поведение в списке - например, null
элементов, когда вы фактически никогда не добавляете ноль.
Вы можете исправить это тривиально, используя подсказку в Javadoc:
List<Integer> numbers = Collections.synchronizedList(new ArrayList<>());
(Обратите внимание, что вы можете увидеть другое «неожиданное» поведение, например, добавление одного и того же числа дважды, потому что count
не увеличивается атомарно или элементы не в правильном порядке в списке)