我注意到Netty有一些内部的Concurrent HashMap实用程序。我很好奇为什么Netty没有使用Java Core内置的ConcurrentHashMap。Netty的实现是否在某些方面更好,或者具有一些新功能?我正在开发一个需要Concurrent HashMap的项目,我正在考虑是否应该使用Netty的实现,但是我在源代码中看不到任何区别。
我注意到Netty有一些内部的Concurrent HashMap实用程序。我很好奇为什么Netty没有使用Java Core内置的ConcurrentHashMap。Netty的实现是否在某些方面更好,或者具有一些新功能?我正在开发一个需要Concurrent HashMap的项目,我正在考虑是否应该使用Netty的实现,但是我在源代码中看不到任何区别。
ConcurrentHashMap
在Java 5中作为java.util.concurrent
包的一部分发布,是由JSR-166推出的。
Netty没有自己的ConcurrentHashMap
,因为它并不比JSR-166更优越——实际上,它很可能只是JSR-166的复制品——这样可以运行在Java 1.4上。
对于你自己的项目,如果你可以依赖于Java 5,那么你应该使用java.util.concurrent.ConcurrentHashMap
。如果你不能,那么你应该把它包含在你的产品中(并修改包名以避免与Java 5运行时内置的项目冲突)。任何时候,只要你能让Doug Lea或Brian Goetz为你编写线程安全的代码,你就应该这样做。
Netty的ConcurrentHashMap实际上存在缺陷,它不是线程安全的。
我最近发现了这一点。 你可以通过简单的测试来证明它。
我们有: thread1循环遍历map.values().stream().sorted().findFirst() thread2并发地向map中添加/删除。
按设计,任何形式的迭代都不应该必须反映映射,但是除非netty版本在jdk流部分依赖于它时搞乱了映射数据,否则它不应该在某些深奥的代码中因ArrayIndexOutOfBoundsException而失败。