我注意到Netty有一些内部的Concurrent HashMap实用程序。我很好奇为什么Netty不使用内置于Java Core中的ConcurrentHashMap。 Netty实现在某种程度上是否更好,或者它是否具有一些新功能?我正在开发一个需要Concurrent HashMap的项目,我正在讨论是否应该使用netty实现,但我看不出源代码有什么不同。
答案 0 :(得分:5)
ConcurrentHashMap
在JSR-166之前不存在,{{3}}已在Java 5中作为java.util.concurrent
包发布。
Netty不包含他们自己的ConcurrentHashMap
,因为它更优越 - 事实上,它肯定只是JSR-166的副本 - 因此它们可以在Java 1.4上运行。
对于您自己的项目,如果您可以依赖Java 5,则应该使用java.util.concurrent.ConcurrentHashMap
。如果您不能,那么您应该将它包含在您的产品中(并更改包名称,以便它与Java 5运行时包含的项目不冲突。)任何时候你都可以让Doug Lea或Brian Goetz为你编写线程安全代码,你可能应该这样做。
答案 1 :(得分:0)
Netty的ConcurrentHashMap实际上是越野车;它不是线程安全的。
我最近发现了。 您可以通过简单的测试来证明这一点。
我们有: thread1遍历map.values()。stream()。sorted()。findFirst() 并发地将thread2从地图中删除。
通过设计,任何形式的迭代都不必一定会反映地图,但是除非在netty版本将地图数据弄乱而jdjk流依赖于该数据的情况下,否则它绝不能在某些深奥的代码中以ArrayIndexOutOfBoundsException失败。