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