Вы синхронизируете дважды, что бессмысленно и, возможно, замедляет код: изменения при переборе по списку требуют синхронизации всей операции, которую вы делаете с synchronized (in_queue_list)
Использование Collections.synchronizedList()
в этом случае излишне (создает оболочку, синхронизирующую отдельные операции).
Однако, так как вы полностью очищаете список, повторное удаление первого элемента является наихудшим из возможных способов сделать это, так как для каждого элемента необходимо скопировать все последующие элементы, что делает это O (n ^ 2) операция - ужасно медленная для больших списков.
Вместо этого просто позвоните clear()
- итерация не требуется.
Edit:
Если вам потребуется синхронизация по одному методу Collections.synchronizedList()
позже, то это правильный путь:
List<Record> in_queue_list = Collections.synchronizedList(in_queue);
in_queue_list.clear(); // synchronized implicitly,
Но во многих случаях синхронизация с одним методом недостаточна (например, для всей итерации, или когда вы получаете значение, выполняйте вычисления на его основе и заменяйте его результатом). В этом случае вам все равно придется использовать ручную синхронизацию, поэтому Collections.synchronizedList()
- это просто бесполезные дополнительные затраты.