Почему у netty есть своя собственная ConcurrentHashMap?
Вопрос
Я заметил, что Netty имеет некоторые внутренние параллельные утилиты HashMap.Мне любопытно, почему Netty не использует ConcurrentHashMap, встроенный в ядро Java.Является ли реализация Netty в каком-то смысле лучше, или у нее есть какая-то новая функциональность?Я работаю над проектом, которому нужна параллельная хэш-карта, и я обсуждаю, следует ли мне использовать реализацию netty, но я не вижу никакой разницы в исходном коде.
Решение
ConcurrentHashMap
не существовало до тех пор, пока JSR-166, который был выпущен в Java 5 как java.util.concurrent
посылка.
Netty не включает в себя их собственные ConcurrentHashMap
потому что это превосходно - на самом деле, это, конечно, просто копия JSR-166 - это для того, чтобы они могли работать на Java 1.4.
Для ваших собственных проектов вы должны просто использовать java.util.concurrent.ConcurrentHashMap
если вы можете установить зависимость от Java 5.И если вы не можете, то вам следует просто включить его в свой продукт (и изменить имя пакета, чтобы оно не конфликтовало с включенными проектами среды выполнения Java 5). В любой момент, когда вы можете попросить Дуга Ли или Брайана Гетца написать для вас потокобезопасный код, вам, вероятно, следует это сделать.
Другие советы
ConcurrentHashMap от Netty на самом деле глючит;это не потокобезопасно.
Я обнаружил это недавно.Вы можете доказать это с помощью простого теста.
У нас было:поток 1 выполняет цикл над map.values().stream().sorted().findFirst() поток 2 одновременно помещает / удаляет с карты.
По замыслу любая форма итерации не обязательно должна отражать карту, но она никогда не должна завершаться сбоем с ArrayIndexOutOfBoundsException в каком-то глубоком и неясном коде, если только версия netty не перепутала данные карты, в то время как материал потоков jdk полагается на это.