Nettyにはなぜ独自のConcurrenthashmapがあるのですか?
質問
Nettyには、内部の同時ハッシュユーティリティがいくつかあることに気付きました。 NettyがJava Coreに組み込まれているConcurrenthashmapを使用しない理由に興味があります。ネットティーの実装は何らかの方法で優れていますか、それとも新しい機能がありますか?私は同時のハッシュマップが必要なプロジェクトに取り組んでおり、ネットの実装を使用する必要があるかどうかを議論していますが、ソースコードに違いはわかりません。
解決
ConcurrentHashMap
まで存在しませんでした JSR-166, 、これはJava 5でリリースされました java.util.concurrent
パッケージ。
Nettyは独自のものを含めません ConcurrentHashMap
それは優れているからです - 実際、それは確かにJSR -166の単なるコピーです - それは彼らがJava 1.4で実行できるようにです。
あなた自身のプロジェクトのために、あなたはただ使用する必要があります java.util.concurrent.ConcurrentHashMap
Java 5に依存できる場合は、できない場合は、製品に含めるだけです(Java 5ランタイムの含まれたプロジェクトと競合しないようにパッケージ名を変更してください) Doug LeaまたはBrian Goetzにスレッドセーフコードを書くことができます。おそらくそうすべきです。
他のヒント
NettyのConcurrenthashmapは実際にはバグです。スレッドセーフではありません。
最近それを見つけました。簡単なテストで証明できます。
map.values()。stream()。sorted()。findfirst()thread2はマップからconcurrenly put/remotedを介してループしました。
あらゆる形式の反復が必ずしもマップを反映するとは限りませんが、JDKストリーミングが依存している間にネット版がマップデータを台無しにしない限り、いくつかの深い曖昧なコードでArrayindexOutofboundsexceptionで失敗することはありません。