为什么Netty有自己的ConcurrentHashMap?

3

我注意到Netty有一些内部的Concurrent HashMap实用程序。我很好奇为什么Netty没有使用Java Core内置的ConcurrentHashMap。Netty的实现是否在某些方面更好,或者具有一些新功能?我正在开发一个需要Concurrent HashMap的项目,我正在考虑是否应该使用Netty的实现,但是我在源代码中看不到任何区别。


1
阅读文档,或者如果你勇敢的话,深入源代码。 - mre
6
可能Netty曾在某个时候支持Java 1.4,但并未被移除。 - Peter Lawrey
你指的是哪些实用工具? - skaffman
2个回答

5

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源代码,但是没有看到任何不同之处,但我想确保我没有漏掉什么。 - Chris Kairalla

0

Netty的ConcurrentHashMap实际上存在缺陷,它不是线程安全的。

我最近发现了这一点。 你可以通过简单的测试来证明它。

我们有: thread1循环遍历map.values().stream().sorted().findFirst() thread2并发地向map中添加/删除。

按设计,任何形式的迭代都不应该必须反映映射,但是除非netty版本在jdk流部分依赖于它时搞乱了映射数据,否则它不应该在某些深奥的代码中因ArrayIndexOutOfBoundsException而失败。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接