Чем меньше у вас потоков, тем меньше у них общего состояния и чем проще шаблон взаимодействия в этом общем состоянии, тем проще будет ваша жизнь.
Вы говорите, что списки генерируют исключение ConcurrentModificationException. Я полагаю, что к вашим спискам обращаются отдельные темы. Итак, первое, что вы должны спросить себя, является ли это необходимым. Разве второй поток не может работать с копией списка?
Если потокам действительно необходим одновременный доступ к списку, блокировка списка в течение всего обхода может быть опцией (Итераторы становятся недействительными, если список изменяется любым другим способом, кроме этого итератора ). Конечно, если вы выполняете другие действия при обходе списка, этот обход может занять много времени, а блокировка других потоков может поставить под угрозу жизнеспособность системы.
Также имейте в виду, что если список является общим состоянием, то же самое относится и к его содержимому, поэтому, если вы хотите обойти блокировку путем копирования списка, обязательно выполните глубокое копирование или докажите, что объекты, содержащиеся в списке, являются сами по себе безопасны.