Я хотел бы иметь возможность условно заменить значение в ConcurrentHashMap. То есть, учитывая:
public class PriceTick { final String instrumentId; ... final long timestamp; ...
И класс (назовем его TickHolder), которому принадлежит ConcurrentHashMap (назовем его просто map).
Я хочу иметь возможность реализовать метод условного помещения, чтобы при отсутствии записи для ключа вставлялась новая, а при наличии существующей записи вставлялась новая только в том случае, если значение временной метки в новый PriceTick больше существующего.
Для решения старой школы HashMap у TickHolder был бы метод put:
public void add(PriceTick tick) { synchronized(map) { if ((map.get(tick.instrumentId) == null) || (tick.getTimestamp() > map.get(tick.instrumentId).getTimestamp()) ) map.put(tick.instrumentId, tick); } }
С ConcurrentHashMap можно было бы отказаться от синхронизации и использовать какой-нибудь атомарный метод, например replace, но это безоговорочно. Так что явно нужно написать метод «условной замены».
Однако, поскольку операция проверки и замены не является атомарной, для обеспечения потоковой безопасности ее необходимо синхронизировать, но мое первоначальное чтение источника ConcurrentHashMap наводит меня на мысль, что внешняя синхронизация и их внутренние блокировки не будут работают очень хорошо, поэтому, как минимум, каждый метод Map, который выполняет структурные изменения и выполняемый содержащий класс, должен быть синхронизирован содержащим классом ... и даже в этом случае мне будет довольно непросто.
Я думал о создании подкласса ConcurrentHashMap, но это кажется невозможным. Он использует внутренний конечный класс HashEntry с доступом по умолчанию, поэтому, хотя ConcurrentHashMap не является окончательным, он не расширяемый.
Это, кажется, означает, что я должен вернуться к реализации TickHolder как содержащей HashMap старой школы, чтобы написать свой метод условной замены.
Итак, вопросы: прав ли я насчет вышеизложенного? Не упустил ли я (надеюсь) что-то очевидное или тонкое, что привело бы к другому выводу? Мне бы очень хотелось воспользоваться этим прекрасным полосатым запирающим механизмом.