Я до сих пор не понимаю, как работает "синхронизированный"
это то, что вам нужно будет исправить. конструкции параллелизма внутри Java, включающие synchronized
, являются фундаментальными понятиями. я бы порекомендовал выбрать Effective Java, 2nd ed.
http://www.amazon.com/Effective-Java-Edition-Joshua-Bloch/dp/0321356683
Одна из основных идей заключается в том, что если у вас есть атомарная операция, в которой один поток читает элемент списка, а другой поток читает элемент списка, вам необходимо заблокировать его двоичным семафором - самый простой способ - использовать Java синхронизированная конструкция.
менее наивный подход может заключаться в том, чтобы один поток извлекал значение из списка, делал то, что ему нужно, а затем "передавал" значение потоку 2, например, добавляя элемент в очередь, принадлежащую потоку. 2.
Описание «правильного» решения для вашего приложения практически невозможно без глубокого знания кода. я просто делаю дикие догадки.