ConcurrentHashMap常问问题

采用了分段锁的思想,将哈希桶数组分成一个个的Segment数组(继承ReentrantLock),每一个Segment里面又有多个HashEntry,也是被volatile修饰的,是为了保证在数组扩容时候的可见性,HashEntry中又有key,hash,value,next属性,而value,next又是被volatile修饰为了保证多线程环境下数据修改时的可见性,多线程环境下ConcurrentHashMap会对这些小的数组进行加锁,这样多线程操作Map就相当于是操作单线程环境下的HashMap,比如A线程对其中一个段进行写操作的时候线程B就不能对其进行写操作,但是线程B可以对其他的段进行写操作,从而实现并发修改和访问。

JDK1.8的ConcurrentHashMap摒弃了分段锁的思想,采用jdk1.8中HashMap的底层机构,Node数组+链表+红黑树。Node是继承了Entry的一个内部类,他的value和next都是被volatile修饰的原因也是为了保证多线程下修改数据的可见性。

采用CAS+synchronized实现更加细粒度的锁,将锁的级别控制在更细粒度的哈希桶数组元素的级别,只需要锁住链表头节点(红黑树的根节点)就不会影响到其他哈希桶数组元素的读写,大大的提高了并发度。

是不需要加锁的,因为Node节点使用了volatile修饰了value和next节点,而在jdk8中同样也是使用了volatile修饰了value和next节点,这样保证可见性了就不需要加锁了。

key不能为空,无法解释,没有什么可说的,可能就是作者的想法。
value不能为空是因为ConcurrentHashMap是工作在多线程环境下的,如果调用get方法,返回null,这个时候就存在二义性,因为ConcurrentHashMap不知道是没有这个key,还是这个key对应的值是不是null。所以干脆不支持value为null。

HashMap的迭代器是强一致性的,而ConcurrentHashMap的迭代器是弱一致性的,因为在多线程环境下,在创建迭代器的过程中,内部的元素会发生变化,如果是在已经遍历过去的数据中发生变化,迭代器是无法反映出来数据发生了改变,如果是发生在未迭代的数据时,这个时候就会反映出来,强一致性就是说只要迭代器创建出来之后数据就不会发生改变了。这样设计的好处就是迭代器线程可以使用原来的老数据进行遍历,写线程可以并发的完成改变,这样就保证了多个线程执行的时候的连续性和可拓展性,提升了并发性能。

JDK1.7中,并发度就是ConcurrentHashMap中的分段个数,即Segment[]数组的长度,默认是16,这个值可以在构造函数中设置。如果自己设置了并发度那么就会和HasHMap一样会去找到大于等于当前输入值的最小的2的幂指数作为实际并发度。如果过小就会产生锁竞争,如果过大,那么就会导致本来位于同一个Segment的的访问会扩散到不同的Segment中,导致性能下降。
JDK1.8中摈弃了Segment的概念,选择使用HashMap的结构,并发度依赖于数组的大小。

ConcurrentHashMap效率高,因为hashTable是给整个hash表加锁,而ConcurrentHashMap锁粒度要更低。

使用Collections.synchronizedMap(Map类型的对象)方法进行同步加锁,把对象转换为SynchronizedMap<K,V>类型。其实就是对HashMap做了一次封装,多个线程竞争一个mutex对象锁,在竞争激烈的情况下性能也非常差,不推荐使用。

  • ConcurrentHashMap甯搁棶闂
    绛旓細澶氱嚎绋嬬幆澧冧笅ConcurrentHashMap浼氬杩欎簺灏忕殑鏁扮粍杩涜鍔犻攣锛岃繖鏍峰绾跨▼鎿嶄綔Map灏辩浉褰撲簬鏄搷浣滃崟绾跨▼鐜涓嬬殑HashMap锛屾瘮濡侫绾跨▼瀵瑰叾涓竴涓杩涜鍐欐搷浣滅殑鏃跺欑嚎绋婤灏变笉鑳藉鍏惰繘琛屽啓鎿嶄綔锛屼絾鏄嚎绋婤鍙互瀵瑰叾浠栫殑娈佃繘琛屽啓鎿嶄綔锛屼粠鑰屽疄鐜板苟鍙戜慨鏀瑰拰璁块棶銆侸DK1.8鐨凜oncurrentHashMap鎽掑純浜嗗垎娈甸攣鐨勬濇兂锛岄噰鐢╦dk1...
  • ConcurrentHashMap濡備綍瀹炵幇楂樻晥鍦扮嚎绋嬪畨鍏?
    绛旓細濡備綍淇濊瘉瀹瑰櫒鏄嚎绋嬪畨鍏ㄧ殑锛 ConcurrentHashMap濡備綍瀹炵幇楂樻晥鍦扮嚎绋嬪畨鍏紵Java鎻愪緵浜嗕笉鍚屽眰闈㈢殑绾跨▼瀹夊叏鏀寔銆傚湪浼犵粺闆嗗悎妗嗘灦鍐呴儴锛岄櫎浜咹ashtable绛夊悓姝ュ鍣紝杩樻彁渚涗簡鎵璋撶殑鍚屾鍖呰鍣紙Synchronized Wrapper锛夛紝鎴戜滑鍙互璋冪敤Collections宸ュ叿绫绘彁渚涚殑鍖呰鏂规硶锛屾潵鑾峰彇涓涓悓姝ョ殑鍖呰瀹瑰櫒锛堝Collections.synchronizedMap锛...
  • JAVA涓嚎绋嬪畨鍏ㄧ殑map鏈夊摢浜?
    绛旓細JAVA涓嚎绋嬪畨鍏ㄧ殑map鏈夛細Hashtable銆乻ynchronizedMap銆ConcurrentHashMap銆俲ava涓璵ap涓嚎绋嬪畨鍏ㄦ庝箞瀹炵幇锛氬悓姝ョ殑map灏辨槸Hashtable, concurrenthashmap銆備綘鐪嬪埌鐨凥ashtable灏辨槸鐩存帴鍦╤ashmap涓婂姞浜嗕釜閿侊紝concurrenthashmap灏辨槸鍒嗘垚澶氫釜鍒嗘閿併俲ava浠g爜涓嚎绋嬪畨鍏ㄧ骇鍒細缁濆绾跨▼瀹夊叏銆傚湪浠讳綍鐜涓嬶紝璋冪敤鑰呴兘涓嶉渶瑕...
  • HashMap绾跨▼涓嶅畨鍏?ConcurrentHashMap绾跨▼瀹夊叏?涓哄暐鍛?
    绛旓細JDK1.8浣跨敤鐨勬槸鏁扮粍+閾捐〃+绾㈤粦鏍戠殑鏁版嵁缁撴瀯锛堝綋閾捐〃鐨勬繁搴﹁揪鍒8鐨勬椂鍊欙紝涔熷氨鏄粯璁ら槇鍊硷紝灏变細鑷姩鎵╁鎶婇摼琛ㄨ浆鎴愮孩榛戞爲鐨勬暟鎹粨鏋勬潵鎶婃椂闂村鏉傚害浠嶰锛坣锛夊彉鎴怬锛坣logN锛夋彁楂樹簡鏁堢巼锛1.HashMap涓嶆槸绾跨▼瀹夊叏鐨勶紝鑰ConcurrentHashMap鏄嚎绋嬪畨鍏ㄧ殑銆2.ConcurrentHashMap閲囩敤閿佸垎娈垫妧鏈紝 灏嗘暣涓狧ash妗惰繘琛屼簡...
  • hashmap绾跨▼瀹夊叏鍚
    绛旓細杩欐槸鍥犱负 HashMap 鐨勮璁″苟娌℃湁鑰冭檻鍒扮嚎绋嬪畨鍏ㄣ傚湪 Java 涓紝鏈変竴浜涚嚎绋嬪畨鍏ㄧ殑 Map 瀹炵幇锛屽 ConcurrentHashMap锛屽畠鍦ㄥ绾跨▼鐜涓嬫彁渚涗簡鏇撮珮鐨勬ц兘锛岃繖鏄洜涓哄畠浣跨敤浜嗕竴绉嶅彨鍋氬垎娈甸攣鐨勬妧鏈紝鍏佽澶氫釜淇敼鎿嶄綔骞惰杩涜銆傚洜姝わ紝濡傛灉浣犲湪澶氱嚎绋嬬幆澧冧笅浣跨敤 HashMap锛屼綘闇瑕侀澶栫殑鍚屾鎺у埗锛屾瘮濡備娇鐢 ...
  • java 閿佹湁鍑犵
    绛旓細鍒嗘閿佸叾瀹炴槸涓绉嶉攣鐨勮璁★紝骞朵笉鏄叿浣撶殑涓绉嶉攣銆傚浜ConcurrentHashMap鑰岃█锛屽叾骞跺彂鐨勫疄鐜板氨鏄氳繃鍒嗘閿佺殑褰㈠紡鏉ュ疄鐜伴珮鏁堢殑骞跺彂鎿嶄綔銆傛垜浠互ConcurrentHashMap鏉ヨ涓涓嬪垎娈甸攣鐨勫惈涔変互鍙婅璁℃濇兂锛孋oncurrentHashMap涓殑鍒嗘閿佺О涓篠egment锛屽畠鍗崇被浼间簬HashMap锛圝DK7涓嶫DK8涓璈ashMap鐨勫疄鐜帮級鐨勭粨鏋勶紝鍗冲唴閮...
  • concurrentHashMap瀵筩oncurrentModificationException鐨勫鐞哶鐧 ...
    绛旓細浣嗘槸 锛両terator鐨勬柟娉曞苟娌℃湁鍋氬埌鍚屾锛岀敋鑷冲悓涓涓嚎绋嬭幏鍙栦袱娆terator鏄袱涓猧terator瀵硅薄锛屼篃灏辨槸璇村綋鍏朵粬绾跨▼鍦╮emove鐨勬椂鍊欙紝璇ョ嚎绋嬩緷鐒跺彲鑳介氳繃iterator瀵硅薄鐨刵ext鏂规硶鎶涘嚭鏁扮粍瓒婄晫绛夊紓甯搞1.鍥犱负concurrentHashMap璇诲啓涓嶄簰鏂ワ紝鎵浠ュ綋鍏朵粬绾跨▼姝e湪淇敼瀹瑰櫒涓儴鍒嗗壇鏈椂锛岃鎿嶄綔涓嶅彈褰卞搷銆 2.table鐢╲iolat...
  • HashMap 鍦ㄥ绾跨▼鐜涓嬩娇鐢ㄩ渶瑕佹敞鎰忎粈涔?
    绛旓細闇瑕佷娇鐢ㄧ嚎绋嬪畨鍏ㄧ殑瀹炵幇鏂瑰紡锛屼緥濡ConcurrentHashMap鎴栬匔ollections.synchronizedMap()鏂规硶灏咹ashMap杞崲鎴愮嚎绋嬪畨鍏ㄧ殑Map銆2. 濡傛灉鍦ㄥ绾跨▼鐜涓嬩娇鐢℉ashMap锛岄渶瑕佹敞鎰忕嚎绋嬪畨鍏ㄩ棶棰橈紝閬垮厤鍑虹幇姝诲惊鐜瓑闂鐨勫彂鐢熴3. 濡傛灉鍦ㄥ绾跨▼鐜涓嬩娇鐢℉ashMap锛岄渶瑕佹敞鎰忔墿瀹归棶棰橈紝閬垮厤鍑虹幇閾捐〃褰㈡垚闂幆绛夐棶棰樼殑鍙戠敓銆
  • 涓轰粈涔ConcurrentHashMap鏄急涓鑷寸殑
    绛旓細hashmap涓殑key鏄笉鍙互閲嶅鐨勶紝鑰寁alue鏄彲浠ラ噸澶嶇殑锛岀彮绾ц窡瀛︾敓锛屽鏋滅敤瀛︾敓鍋歬ey锛屾瘡涓鐢熼兘鍙互寰楀埌涓涓彮绾э紝涓嶅悓瀛︾敓鐨勭彮绾у彲鑳界浉鍚岋紝浣嗗鏋滅敤鐝骇鍋歬ey锛岄偅鐝骇鍒板簳瀵瑰簲閭d釜瀛︾敓鍛紵浣犲彲鑳借璇寸彮绾у搴旀暣涓彮鐨勫鐢熶笉灏辫浜嗭紵娌¢敊锛屽鏋滆杩欐牱鐨勮瘽锛屼綘鍙互鐢ㄧ彮绾у仛key锛岀劧鐢ㄤ竴涓鐢熺殑闆嗗悎锛堝...
  • HashMap浠ュ強鍏跺瓙绫诲叧閿ф荤粨
    绛旓細HashMap浣跨敤閾捐〃鏉ヨВ鍐崇鎾為棶棰橈紝褰撶鎾炲彂鐢熶簡锛屽璞″皢浼氬瓨鍌ㄥ湪閾捐〃鐨勪笅涓涓妭鐐逛腑銆俬ashMap鍦ㄦ瘡涓摼琛ㄨ妭鐐瑰瓨鍌ㄩ敭鍊煎瀵硅薄銆傚綋涓や釜涓嶅悓鐨勯敭鍗存湁鐩稿悓鐨刪ashCode鏃讹紝浠栦滑浼氬瓨鍌ㄥ湪鍚屼竴涓猙ucket浣嶇疆鐨勯摼琛ㄤ腑銆傞敭瀵硅薄鐨別quals()鏉ユ壘鍒伴敭鍊煎銆ConcurrentHashMap鍦╦dk1.7涓娇鐢ㄤ簡鍒嗘閿,鍏朵腑segment缁ф壙浜 Reentr...
  • 本站交流只代表网友个人观点,与本站立场无关
    欢迎反馈与建议,请联系电邮
    2024© 车视网