Такого не существует, как сказано в комментариях, даже ConcurrentHashMap
вам не поможет.
Будьте очень осторожны, чтобы не попасться в ловушку анти-паттерна «проверяй, чем действовать». Так, например, не делать:
Set<Integer> syncIds = Collections.synchronizedSet(ids);
syncIds.add(o.getId())
if(ids.size() > 10) {....}
Как отдельные операции, они действительно потокобезопасны, но как составные операции они не являются.
Имейте в виду, что, поскольку вы обновляете это HashSet
под блокировкой, при чтении это должно быть сделано под той же блокировкой , вот как происходит до работает. Так что если вы выставите метод:
public Set<Integer> getIds(){
return ids;
}
Чтобы это работало правильно, и вы не столкнулись с неожиданностями, этот метод также должен быть синхронизирован.