ConcurrentHashMap如何实现高效地线程安全? concurrenthashmap 怎么实现线程安全

concurrenthashmap\u662f\u600e\u4e48\u5b9e\u73b0\u7ebf\u7a0b\u5b89\u5168\u7684

ConcurrentMap\u80fd\u591f\u4fdd\u8bc1\u6bcf\u4e00\u6b21\u8c03\u7528\uff08\u4f8b\u5982\u4e00\u6b21putIfAbsent\uff09\u90fd\u662f\u539f\u5b50\u64cd\u4f5c\uff0c\u4e0d\u53d7\u591a\u7ebf\u7a0b\u5f71\u54cd\uff0c\u4f46\u5e76\u4e0d\u4fdd\u8bc1\u591a\u6b21\u8c03\u7528\u4e4b\u95f4\u4e5f\u662f\u539f\u5b50\u64cd\u4f5c\u3002
\u4ee5\u4e0a\u5b9e\u73b0\u7684GetKeyBM\u65b9\u6cd5\u4e2d\uff0cConcurrentMap\u7684\u65b9\u6cd5\u88ab\u8c03\u7528\u4e86\u8bb8\u591a\u6b21\uff0c\u4e0d\u540c\u7ebf\u7a0b\u4e4b\u95f4\u5fc5\u7136\u5b58\u5728\u7740\u7ade\u4e89\u5173\u7cfb\uff0c\u5bfc\u81f4\u6700\u7ec8\u7ed3\u679c\u4e0d\u6b63\u786e\u3002

\u73b0\u5728\u7684\u76ee\u6807\u662f\uff0c\u5c06\u4e0b\u9762\u63cf\u8ff0\u7684\u8fd9\u4e00\u7cfb\u5217\u64cd\u4f5c\u4f5c\u4e3a\u539f\u5b50\u64cd\u4f5c\uff1a
\u201c\u5bf9\u6bcf\u4e2a\u5206\u51fa\u6765\u7684\u8bcd\u901a\u8fc7\u8c03\u7528GetKeyBM\u65b9\u6cd5\uff0c\u5982\u679c\u5b58\u5728\uff0c\u5219\u53d6\u51fa\u5bf9\u5e94\u7684\u7f16\u7801\uff0c\u5982\u679c\u4e0d\u5b58\u5728\uff0c\u5219\u52a0\u5165KeyTotal\u4e2d\uff0c\u5e76\u4e14\u7ed9\u4e88\u4e00\u4e2a\u7f16\u7801\uff0c\u5c31\u662fKeyTotal\u4e2d\u7684\u53d8\u91cf\u6570\u52a0\u4e00\u201d
\u6700\u76f4\u89c2\u7684\u65b9\u6cd5\u5c31\u662f\u6574\u5757\u540c\u6b65\uff1a
synchronized (KeyTotal) {
Integer value = KeyTotal.get(word);
if (value == null) {
value = KeyTotal.size() + 1;
KeyTotal.put(word, value);
}
}
\u8fd9\u6837\uff0c\u4f7f\u7528\u666e\u901a\u7684map\u5c31\u53ef\u4ee5\u4e86\u3002

\u5982\u679c\u4f60\u4f7f\u7528\u7684\u662fJava 8\u7684\u8bdd\uff0cConcurrentMap\u6709\u4e00\u4e2a\u7c7b\u4f3c\u7684\u65b9\u6cd5 computeIfAbsent \u53ef\u4ee5\u4f7f\u7528\uff1a
KeyTotal.computeIfAbsent(word, k -> KeyTotal.size() + 1);
\u8fd9\u6837\u624d\u80fd\u786e\u4fdd\u4e00\u6b21\u539f\u5b50\u64cd\u4f5c\u3002
computeIfAbsent\u65b9\u6cd5\u7684\u4f5c\u7528\u662f\uff0c\u5982\u679cword\u952e\u503c\u4e0d\u5b58\u5728\uff0c\u5219\u4f7f\u7528\u7b2c\u4e8c\u4e2a\u53c2\u6570\u6765\u751f\u6210\u4e00\u4e2a\u503c\u653e\u5165map\u4e2d\uff0c\u7b49\u4ef7\u4e8e\u4ee5\u4e0b\u4ee3\u7801\uff0c\u5e76\u4e14\u662f\u539f\u5b50\u64cd\u4f5c\uff1a
V computeIfAbsent(K key, Function mappingFunction):

if (map.get(key) == null) {
V newValue = mappingFunction.apply(key);
if (newValue != null)
return map.putIfAbsent(key, newValue);
}
\u6b63\u597d\u4e0e\u4f60\u7684\u76ee\u6807\u662f\u4e00\u81f4\u7684\u3002

ConcurrentMap\u80fd\u591f\u4fdd\u8bc1\u6bcf\u4e00\u6b21\u8c03\u7528\uff08\u4f8b\u5982\u4e00\u6b21putIfAbsent\uff09\u90fd\u662f\u539f\u5b50\u64cd\u4f5c\uff0c\u4e0d\u53d7\u591a\u7ebf\u7a0b\u5f71\u54cd\uff0c\u4f46\u5e76\u4e0d\u4fdd\u8bc1\u591a\u6b21\u8c03\u7528\u4e4b\u95f4\u4e5f\u662f\u539f\u5b50\u64cd\u4f5c\u3002
\u4ee5\u4e0a\u5b9e\u73b0\u7684GetKeyBM\u65b9\u6cd5\u4e2d\uff0cConcurrentMap\u7684\u65b9\u6cd5\u88ab\u8c03\u7528\u4e86\u8bb8\u591a\u6b21\uff0c\u4e0d\u540c\u7ebf\u7a0b\u4e4b\u95f4\u5fc5\u7136\u5b58\u5728\u7740\u7ade\u4e89\u5173\u7cfb\uff0c\u5bfc\u81f4\u6700\u7ec8\u7ed3\u679c\u4e0d\u6b63\u786e\u3002

\u73b0\u5728\u7684\u76ee\u6807\u662f\uff0c\u5c06\u4e0b\u9762\u63cf\u8ff0\u7684\u8fd9\u4e00\u7cfb\u5217\u64cd\u4f5c\u4f5c\u4e3a\u539f\u5b50\u64cd\u4f5c\uff1a
\u201c\u5bf9\u6bcf\u4e2a\u5206\u51fa\u6765\u7684\u8bcd\u901a\u8fc7\u8c03\u7528GetKeyBM\u65b9\u6cd5\uff0c\u5982\u679c\u5b58\u5728\uff0c\u5219\u53d6\u51fa\u5bf9\u5e94\u7684\u7f16\u7801\uff0c\u5982\u679c\u4e0d\u5b58\u5728\uff0c\u5219\u52a0\u5165KeyTotal\u4e2d\uff0c\u5e76\u4e14\u7ed9\u4e88\u4e00\u4e2a\u7f16\u7801\uff0c\u5c31\u662fKeyTotal\u4e2d\u7684\u53d8\u91cf\u6570\u52a0\u4e00\u201d
\u6700\u76f4\u89c2\u7684\u65b9\u6cd5\u5c31\u662f\u6574\u5757\u540c\u6b65\uff1a
synchronized (KeyTotal) {
Integer value = KeyTotal.get(word);
if (value == null) {
value = KeyTotal.size() + 1;
KeyTotal.put(word, value);
}
}
\u8fd9\u6837\uff0c\u4f7f\u7528\u666e\u901a\u7684map\u5c31\u53ef\u4ee5\u4e86\u3002

\u5982\u679c\u4f60\u4f7f\u7528\u7684\u662fJava 8\u7684\u8bdd\uff0cConcurrentMap\u6709\u4e00\u4e2a\u7c7b\u4f3c\u7684\u65b9\u6cd5 computeIfAbsent \u53ef\u4ee5\u4f7f\u7528\uff1a
KeyTotal.computeIfAbsent(word, k -> KeyTotal.size() + 1);
\u8fd9\u6837\u624d\u80fd\u786e\u4fdd\u4e00\u6b21\u539f\u5b50\u64cd\u4f5c\u3002
computeIfAbsent\u65b9\u6cd5\u7684\u4f5c\u7528\u662f\uff0c\u5982\u679cword\u952e\u503c\u4e0d\u5b58\u5728\uff0c\u5219\u4f7f\u7528\u7b2c\u4e8c\u4e2a\u53c2\u6570\u6765\u751f\u6210\u4e00\u4e2a\u503c\u653e\u5165map\u4e2d\uff0c\u7b49\u4ef7\u4e8e\u4ee5\u4e0b\u4ee3\u7801\uff0c\u5e76\u4e14\u662f\u539f\u5b50\u64cd\u4f5c\uff1a
V computeIfAbsent(K key, Function mappingFunction):

if (map.get(key) == null) {
V newValue = mappingFunction.apply(key);
if (newValue != null)
return map.putIfAbsent(key, newValue);
}
\u6b63\u597d\u4e0e\u4f60\u7684\u76ee\u6807\u662f\u4e00\u81f4\u7684\u3002

Java 提供了不同层面的线程安全支持。在传统集合框架内部,除了 Hashtable 等同步容器,还提供了所谓的同步包装器(Synchronized Wrapper),我们可以调用 Collections 工具类提供的包装方法,来获取一个同步的包装容器(如 Collections.synchronizedMap),但是它们都是利用非常粗粒度的同步方式,在高并发情况下,性能比较低下。

另外,更加普遍的选择是利用并发包提供的线程安全容器类,它提供了:



1.为什么需要 ConcurrentHashMap? Hashtable 本身比较低效,因为它的实现基本就是将 put、get、size 等各种方法加上“synchronized”。简单来说,这就导致了所...

一般情况下的话如果说想要实现高校第一县城安全的话这个也是非常不错的可以直接就是从三个方面进行测算所

每个操作都是原子操作,都带锁的,保证一个成员同一时间只被一个方法调用

项目中经常会有多个线程要访问同一个数据,此时比较常用的办法是用synchronize加锁,CAS去进行安全的累加,去实现多线程场景下的安全的更新一个数据的效果,HashMap是用的比较多,可能就是多个线程同时读写一个HashMap,HashMap是线程不安全的,如果对整个map去synchronized加锁,类似下面这种伪代码也没那么必要。

  • hashmap鏄嚎绋嬪畨鍏ㄧ殑鍚
    绛旓細ConcurrentHashMap 鏄 Java 闆嗗悎妗嗘灦鐨勪竴閮ㄥ垎锛屽畠鎻愪緵浜嗙嚎绋嬪畨鍏ㄧ殑 HashMap銆侰oncurrentHashMap 閫氳繃浣跨敤鍒嗘閿佹妧鏈紝鍏佽澶氫釜绾跨▼鍦ㄤ笉鍚岀殑娈典笂杩涜璇诲啓鎿嶄綔锛屼粠鑰屾彁楂樹簡骞跺彂鎬ц兘銆傛澶栵紝Java 8 寮曞叆鐨 ConcurrentHashMap.computeIfAbsent 鍜 ConcurrentHashMap.computeIfPresent 鏂规硶涔熶负骞跺彂璁$畻鎻愪緵浜嗘洿渚挎嵎鐨...
  • HashMap銆ConcurrentHashMap銆丠ashTable鐨勫尯鍒
    绛旓細寮曞叆 ConcurrentHashMap 鏄负浜嗗湪鍚屾闆嗗悎HashTable涔嬮棿鏈夋洿濂界殑閫夋嫨锛 HashTable 涓 HashMap 銆 ConcurrentHashMap 涓昏鐨勫尯鍒湪浜嶩ashMap涓嶆槸鍚屾鐨勩佺嚎绋嬩笉瀹夊叏鐨勫拰涓嶉傚悎搴旂敤浜庡绾跨▼骞跺彂鐜涓嬶紝鑰 ConcurrentHashMap 鏄嚎绋嬪畨鍏ㄧ殑闆嗗悎瀹瑰櫒锛岀壒鍒槸鍦ㄥ绾跨▼鍜屽苟鍙戠幆澧冧腑锛岄氬父浣滀负 Map 鐨勪富瑕佸疄鐜般傞櫎浜...
  • ConcurrentHashMap
    绛旓細鏁翠釜 ConcurrentHashMap 鐢变竴涓釜 Segment 缁勬垚锛孲egment 浠h〃鈥濋儴鍒嗏滄垨鈥濅竴娈碘滅殑鎰忔濓紝鎵浠ュ緢澶氫汉閮戒細灏嗗叾鎻忚堪涓哄垎娈甸攣銆傜畝鍗曠殑璇达紝ConcurrentHashMap 鏄竴涓 Segment 鏁扮粍锛孲egment 閫氳繃缁ф壙 ReentrantLock 鏉ヨ繘琛屽姞閿侊紝鎵浠ユ瘡娆¢渶瑕佸姞閿佺殑鎿嶄綔閿佷綇鐨勬槸涓涓 segment锛岃繖鏍峰彧瑕佷繚璇佹瘡涓 Segment 鏄嚎绋嬪畨鍏...
  • HashMap銆丠ashTable銆ConcurrentHashMap鐨勫師鐞嗕笌鍖哄埆
    绛旓細ConcurrentHashMap鏄敱Segment鏁扮粍缁撴瀯鍜孒ashEntry鏁扮粍缁撴瀯缁勬垚銆係egment鏄竴涓彲閲嶅叆閿侊紙ReentrantLock锛夛紝鍦–oncurrentHashMap閲屾壆婕旈攣鐨勮鑹诧紱HashEntry鍒欑敤浜庡瓨鍌ㄩ敭鍊煎鏁版嵁銆備竴涓狢oncurrentHashMap閲屽寘鍚竴涓猄egment鏁扮粍銆係egment鐨勭粨鏋勫拰HashMap绫讳技锛屾槸涓绉嶆暟缁勫拰閾捐〃缁撴瀯銆備竴涓猄egment閲屽寘鍚竴涓狧ashEntry鏁扮粍锛...
  • Java骞跺彂鍖呴噷鐨concurrentHashMap鍦ㄤ粈涔堟儏鍐典笅tryPresize鏂规硶閲岀殑s...
    绛旓細鍦 Java 鐨 ConcurrentHashMap 绫讳腑锛宼ryPresize 鏂规硶涓昏鐢ㄤ簬鍦ㄩ璋冩暣杩囩▼涓垽鏂槸鍚﹂渶瑕佽皟鏁 ConcurrentHashMap 鐨勫ぇ灏忋傝繖涓柟娉曠殑鍙傛暟 sc 鏄 ConcurrentHashMap 鐨 segment count锛堟鏁帮級銆傚湪 tryPresize 鏂规硶涓紝while 寰幆鐨勬潯浠舵槸 (sc > 1 && sc > ((sc >> 2) + 1))銆傝繖涓潯浠剁殑鎰忔濇槸锛...
  • 涓鍥句簡瑙ConcurrentHashMap搴曞眰鍘熺悊
    绛旓細1銆ConcurrentHashMap搴曞眰鏁版嵁缁撴瀯鏄竴涓暟缁則able 2銆乼able鏁扮粍涓婃寕鐫鍗曞悜閾捐〃鎴栫孩榛戞爲 3銆乶ew ConcurrentHashMap();濡傛灉娌℃湁鎸囧畾闀垮害鐨勮瘽锛岄粯璁ゆ槸16锛屽苟涓旀暟缁勯暱搴﹀繀椤绘槸2鐨刵娆″箓锛岃嫢鑷畾涔夊垵濮嬪寲鐨勯暱搴︿笉鏄2鐨刵娆″箓锛岄偅涔堝湪鍒濆鍖栨暟缁勬椂锛屼細鍚ф暟缁勯暱搴﹁缃负澶т簬鑷畾涔夐暱搴︾殑鏈杩戠殑2鐨刵娆″箓銆傦紙濡傦細...
  • hashmap鍜concurrenthashmap鐨勫尯鍒槸浠涔?
    绛旓細hashmap鍜concurrenthashmap鐨勫尯鍒涓嬶細HashMap涓嶆槸绾跨▼瀹夊叏鐨勶紝鑰ConcurrentHashMap鏄嚎绋嬪畨鍏ㄧ殑銆侰oncurrentHashMap閲囩敤閿佸垎娈垫妧鏈紝灏嗘暣涓狧ash妗惰繘琛屼簡鍒嗘segment锛屼篃灏辨槸灏嗚繖涓ぇ鐨勬暟缁勫垎鎴愪簡鍑犱釜灏忕殑鐗囨segment锛岃屼笖姣忎釜灏忕殑鐗囨segment涓婇潰閮芥湁閿佸瓨鍦ㄣ傞偅涔堝湪鎻掑叆鍏冪礌鐨勬椂鍊欏氨闇瑕佸厛鎵惧埌搴旇鎻掑叆鍒板摢涓涓...
  • 濡備綍鍦╦ava涓娇鐢ConcurrentHashMap
    绛旓細鍙傝冨涓嬪唴瀹:ConcurrentHashMap閿佺殑鏂瑰紡鏄◢寰粏绮掑害鐨勩 ConcurrentHashMap灏唄ash琛ㄥ垎涓16涓《锛堥粯璁ゅ硷級锛岃濡俫et,put,remove绛夊父鐢ㄦ搷浣滃彧閿佸綋鍓嶉渶瑕佺敤鍒扮殑妗躲傝瘯鎯筹紝鍘熸潵 鍙兘涓涓嚎绋嬭繘鍏ワ紝鐜板湪鍗磋兘鍚屾椂16涓啓绾跨▼杩涘叆锛堝啓绾跨▼鎵嶉渶瑕侀攣瀹氾紝鑰岃绾跨▼鍑犱箮涓嶅彈闄愬埗锛屼箣鍚庝細鎻愬埌锛夛紝骞跺彂鎬х殑鎻愬崌鏄樉鑰...
  • hashmap鍜concurrenthashmap鐨勫尯鍒槸浠涔?
    绛旓細鏈澶х殑鍖哄埆灏辨槸ConcurrentHashMap鏄嚎绋嬪畨鍏ㄧ殑,hashMap涓嶆槸绾跨▼瀹夊叏鐨勩傚熀浜庡搱甯岃〃鐨 Map 鎺ュ彛鐨勫疄鐜般傛瀹炵幇鎻愪緵鎵鏈夊彲閫夌殑鏄犲皠鎿嶄綔锛屽苟鍏佽浣跨敤 null 鍊煎拰 null 閿傦紙闄や簡闈炲悓姝ュ拰鍏佽浣跨敤 null 涔嬪锛孒ashMap 绫讳笌 Hashtable 澶ц嚧鐩稿悓銆傦級姝ょ被涓嶄繚璇佹槧灏勭殑椤哄簭锛岀壒鍒槸瀹冧笉淇濊瘉璇ラ『搴忔亽涔呬笉鍙樸傛...
  • ConcurrentHashMap闈㈣瘯闂鎬荤粨
    绛旓細1.ConcurrentHashMap鏄嚎绋嬪畨鍏ㄧ殑锛孒ashMap鏄嚎绋嬩笉瀹夊叏鐨 2.ConcurrentHashMap涓嶅厑璁窴ey涓簄ull鐨勫兼彃鍏ャ傝孒ashMap鏄彲浠ョ殑 Q:JDK8鐨凜oncurrentHashMap鍜孞DK7鐨凜oncurrentHashMap鏈変粈涔堝尯鍒紵A:1.JDK7鐨凜oncurrentHashMap閲囩敤鍒嗘閿佺殑绛栫暐锛屽皢鏁翠釜鏁扮粍鍒嗘垚澶氫釜segment锛屽杩欎簺segment杩涜鍒嗘鍔犻攣锛屼娇鐢ㄧ殑閿佹槸...
  • 本站交流只代表网友个人观点,与本站立场无关
    欢迎反馈与建议,请联系电邮
    2024© 车视网