Бих искал да мога условно да заменя стойност в 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 от старата школа, за да напиша моя метод за условна замяна.
И така, въпросите: прав ли съм за горното? Пропуснал ли съм (надявам се) нещо, било то очевидно или едва доловимо, което да доведе до различно заключение? Наистина бих искал да мога да използвам този прекрасен раиран заключващ механизъм тук.