HashMap、HashTable、ConcurrentHashMap的原理与区别

从类图中可以看出来在存储结构中ConcurrentHashMap比HashMap多出了一个类Segment。 ConcurrentHashMap是由Segment数组结构和HashEntry数组结构组成。Segment是一个可重入锁(ReentrantLock),在ConcurrentHashMap里扮演锁的角色;HashEntry则用于存储键值对数据。一个ConcurrentHashMap里包含一个Segment数组。Segment的结构和HashMap类似,是一种数组和链表结构。一个Segment里包含一个HashEntry数组,每个HashEntry是一个链表结构的元素,每个Segment守护着一个HashEntry数组里的元素。当对HashEntry数组的数据进行修改时,必须首先获得与它对应的segment锁。

ConcurrentHashMap是使用了锁分段技术来保证线程安全的。

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

ConcurrentHashMap提供了与Hashtable和SynchronizedMap不同的锁机制。Hashtable中采用的锁机制是一次锁住整个hash表,从而在同一时刻只能由一个线程对其进行操作;而ConcurrentHashMap中则是一次锁住一个桶。

Hashtable容器在竞争激烈的并发环境下表现出效率低下的原因是因为所有访问Hashtable的线程都必须竞争同一把锁,假如容器里有多把锁,每一把锁用于锁容器其中一部分数据,那么当多线程访问容器里不同数据段的数据时,线程间就不会存在锁竞争,从而可以有效提高并发访问效率,这就是ConcurrentHashMap所使用的锁分段技术。首先将数据分成一段一段存储,然后给每一段数据配一把锁,当一个线程占用锁访问其中一个段数据的时候,其它段的数据也能被其它线程访问。



  • 鍝綅澶т緺璇磋java涓殑鎺ュ彛
    绛旓細Hashtabl,涔熸槸Map鎺ュ彛鐨勫疄鐜扮被,浠栧拰HashMap姣旇緝鐩镐技,鍙笉杩囪繖涓被瀵硅薄鏄噸閲忕骇鐨,涔熸槸绾跨▼瀹夊叏鐨勩備粬涓嶅厑璁窴ey鍜寁alue涓簄ull銆侾roperties,杩欎釜绫绘槸Hashtable鐨勫瓙绫,浠栫殑Key鍜寁alue鍙兘鏄瓧绗︿覆銆係ortedMap鏄疢ap鐨勫瓙鎺ュ彛TreeMap,鏄疭ortedMap鐨勫疄鐜扮被,浠栦細鎸夌収Key杩涜鎺掑簭銆傚拰TreeSet绫讳竴鏍,鍦ㄤ娇鐢ㄨ嚜瀹氫箟绫讳綔Key鏃,瑕...
  • 瀛﹀彿鏄敭瀵硅薄,鍚嶅瓧鏄煎璞,鎬庢牱灏佽涓涓敤瀛﹀彿妫绱㈠悕瀛楀湴鏂规硶_鐧惧害鐭 ...
    绛旓細鍙互鐢ㄤ竴涓 Map 绫汇傛瘮濡 Hashmap 鍙互銆備竴涓 Map 绫婚兘鍖呮嫭涓涓猭ey鍜屼竴涓獀alue锛岀鍚堜綘鐨勬儏鍐点侶ashmap<Integer, String> students = new Hashmap<Integer, String>();students.put(100,"Jimmy");students.put(101,"Johnny");students.get(100)灏辨槸鈥淛immy鈥濄
  • java涓庝箞绮剧畝If璇彞鐨勫爢鐮
    绛旓細1. 涓鏉f璇彞,鍙互鐢ㄤ笁鐩繍绠楃 2. 灏戦噺鐨刬f璇彞,涔熷彲浠ョ敤switch case 鏉ュ鐞 3. 濡傛灉鏉′欢鍒ゆ柇寰堝,鏈夊緢澶氱殑if else ,閭d箞鍙互鎬濊冧笅.鑳戒笉鑳界簿绠涓嬮昏緫鍒ゆ柇 濡傛灉閫昏緫涓嶈兘绠鍖, 閭d箞鍙互鑰冭檻鐢HashMap,HashTabl杩欑key<-->Value鐨勬暟鎹粨鏋勬潵瀛樺偍 姣斿鏈夊緢澶氱殑寮傚父閿欒淇℃伅,瑕佹彁绀,濡傞敊璇唬鐮105 ...
  • 扩展阅读:hashtable hashmap ... hashmap解决hash碰撞 ... hashmap java ... c#hashtable ... java ... hack css ... hashmap treemap ... hashphotosapp下载 ... weakhashmap继承自hashmap ...

    本站交流只代表网友个人观点,与本站立场无关
    欢迎反馈与建议,请联系电邮
    2024© 车视网