Подтвердить что ты не робот

В Java используется компаратор, используемый в потоке Collections.sort()?

Если я создаю один экземпляр Компаратора, может ли этот экземпляр использоваться в нескольких потоках для сортировки коллекций с помощью Collections.sort()? Или мне нужно создать новый экземпляр Comparator для каждого вызова Collections.sort() для обеспечения безопасности потоков?

4b9b3361

Ответ 1

Это полностью зависит от того, как вы реализуете Comparator. Если, например, у него есть переменные экземпляра, которые записываются или содержимое которых неявно изменяется во время сравнения, оно не будет потоковым.

В большинстве реализаций Comparator нет такой вещи, но один сценарий, который может разумно произойти, использует SimpleDateFormat для сравнения строк, которые представляют даты. К сожалению, SimpleDateFormat сам по себе не является потокобезопасным.

Ответ 2

Компаратор - это интерфейс, он не имеет собственных свойств concurrency. Это зависит от того, как вы пишете его, если ваша реализация потокобезопасна или нет. Если все, что он делает, ограничивается областью действия метода сравнения (без экземпляра или состояния уровня класса), и все ресурсы, которые он использует, являются потокобезопасными, тогда он сам будет потокобезопасным.

Ответ 3

Я был бы очень удивлен, если бы нашел несетевой безопасный компаратор, поскольку они обычно (всегда?) реентерабельны.

Проблема concurrency заключалась бы в том, что сортировка коллекции была изменена во время сортировки.