Я согласен с другими по поводу Iterator
и remove()
.
Что касается синхронизации, я хотел бы добавить, что синхронизация предназначена для управления взаимодействиями между различными потоками .
Для объекта характерно синхронизировать несколько методов, и один из них будет вызывать другой. Поэтому разработчики языка решили, что один и тот же поток не будет заблокирован им самим при синхронизации.
Кроме того, думая об этом, если нить заблокирована, ожидая себя, у вас есть великолепная голодная перспектива! ; -)
Так что это отвечает на один из ваших вопросов: невозможно избежать проблемы, синхронизируя ваш код.