ConcurrentHashMapとHashtableの違い

基礎となるデータ構造:JDK1.7 +リンクリストの実装構造のようJDK1.8 HashMap1.8で使用されるデータ構造を用いて、ConcurrentHashMapの底部セグメント配列、+ /赤と黒の二分木リンクリストアレイ。同様のアレイ+リンクされたリストに基づいてJDK1.8前にハッシュテーブルとHashMapの基礎となるデータ構造は、ハッシュマップの配列の主題であり、リストは、ハッシュ衝突を解決するために主に存在である

スレッドセーフな方法(重要)を達成します。

①JDK1.7時間で、アレイ全体分割バレルセグメント(セグメント)のConcurrentHashMapの(ロックセグメント)の、それぞれがデータの一部のみ前記ロックコンテナ、コンテナのマルチスレッドアクセス異なるデータセグメントをロックし、それはそこには、ロック競合することなく、同時実行率が向上します。JDK1.8は、時間セグメントの概念を放棄したために、しかし、直接リンクされたリストデータ構造ノードアレイ+ +赤黒木は、同時実行制御を実現し、CASが作動使用して同期。(後の最適化の多くを行うために、同期ロックのJDK1.6)全体は、あなたはまだJDK1.8でのデータ構造セグメントを見ることができますが、最適化され、スレッドセーフなHashMapのように見えますが、プロパティを単純化した、唯一の旧バージョンとの互換性;
②ハッシュテーブル(同ロック):使用は、スレッドの安全性を確保するために、同期、効率は非常に低いです。1つのスレッドが同期メソッドにアクセスするときは、他のスレッドでも、このような、あなたが入れた要素を使用するための別のスレッドを追加することはできませんプットを使用して要素を追加するなど、ポーリング状態を同期方法、ブロックされる可能性があるにアクセスしたり、入力することができ、あなたは競争がますます熾烈になり、getを使用することはできません効率低下。

ハッシュテーブル:

 

JDK1.7的のConcurrentHashMap:

ConcurrentHashMapのJDK1.8(TreeBin:赤と黒の二分木のノードNode:リストノード):

スレッドセーフ/基本となる具体的な実現のConcurrentHashMapの特定の実装

JDK1.7

首先将数据分为一段一段的存储,然后给每一段数据配一把锁,当一个线程占用锁访问其中一个段数据时,其他段的
数据也能被其他线程访问。

ConcurrentHashMap 是由 Segment 数组结构和 HashEntry 数组结构组成。
Segment 实现了 ReentrantLock,所以 Segment 是一种可重入锁,扮演锁的角色。HashEntry 用于存储键值对数据。

static class Segment<K,V> extends ReentrantLock implements Serializable {
}

一个 ConcurrentHashMap 里包含一个 Segment 数组。Segment 的结构和HashMap类似,是一种数组和链表结
构,一个 Segment 包含一个 HashEntry 数组,每个 HashEntry 是一个链表结构的元素,每个 Segment 守护着一个
HashEntry数组里的元素,当对 HashEntry 数组的数据进行修改时,必须首先获得对应的 Segment的锁。

JDK1.8
ConcurrentHashMap取消了Segment分段锁,采用CAS和synchronized来保证并发安全。数据结构跟HashMap1.8的结构类似,数组+链表/红黑二叉树。synchronized只锁定当前链表或红黑二叉树的首节点,这样只要hash不冲突,就不会产生并发,效率又提升N倍。



おすすめ

転載: www.cnblogs.com/zhangyaotong/p/11246088.html