ConcurrentHashMap面试问题总结

Q:ConcurrentHashMap和HashMap的区别是什么?
A:
1.ConcurrentHashMap是线程安全的,HashMap是线程不安全的
2.ConcurrentHashMap不允许Key为null的值插入。而HashMap是可以的

Q:JDK8的ConcurrentHashMap和JDK7的ConcurrentHashMap有什么区别?
A:
1.JDK7的ConcurrentHashMap采用分段锁的策略,将整个数组分成多个segment,对这些segment进行分段加锁,使用的锁是ReentrantLock。而JDK8中的ConcurrentHashMap不采用分段锁的方式,直接使用Synchronized来进行。
2.JDK8中的ConcurrentHashMap新增了红黑树,并且插入用的是尾插法。
3.JDK7中的ConcurrentHashMap进行扩容时,是对当前的segment进行扩容,不会对其他segment有影响。而JDK8中就跟HashMap一样。整体扩容,但是保证线程安全

Q:JDK7中的ConcurrentHashMap是如何扩容的
A:JDK7中对每一段segment进行扩容,每一段segment的扩容跟HashMap保持一致

Q:JDK8中的ConcurrentHashMap是如何扩容的
A:在扩容时,首先会生成一个双倍大小的数组,生成完数组后,线程就会开始转移元素,在扩容的过程中,如果有其他线程在put,那么这个put线程会帮助去进行元素的转移,虽然叫转移,但是其实是基于原数组上的Node信息去生成一个新的Node的,也就是原数组上的Node不会消失,因为在扩容的过程中,如果有其他线程在get也是可以的。

Q:ConcurrentHashMap是如何保证线程安全的
A:
1.在JDK7的时候。ConcurrentHashMap是通过ReentrantLock+CAS+分段思想来保证的并发安全的,在JDK7的ConcurrentHashMap中,首先有一个Segment数组,存的是Segment对象,Segment相当于一个小HashMap,Segment内部有一个HashEntry的数组,也有扩容的阈值,同时Segment继承了ReentrantLock类,同时在Segment中还提供了put,get等方法,比如Segment的put方法在一开始就会去加锁,加到锁之后才会把key,value存到Segment中去,然后释放锁。同时在ConcurrentHashMap的put方法中,会通过CAS的方式把一个Segment对象存到Segment数组的某个位置中。同时因为一个Segment内部存在一个HashEntry数组,所以和HashMap对比来看,相当于分段了,每段里面是一个小的HashMap,每段公用一把锁,同时在ConcurrentHashMap的构造方法中是可以设置分段的数量的,叫做并发级别concurrencyLevel.
2.在JDK8的时候,ConcurrentHashMap是通过synchronized+cas来实现了。在JDK8中只有一个数组,就是Node数组,Node就是key,value,hashcode封装出来的对象,和HashMap中的Entry一样,在JDK8中通过对Node数组的某个index位置的元素进行同步,达到该index位置的并发安全。同时内部也利用了CAS对数组的某个位置进行并发安全的赋值。

  • 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© 车视网