如何在java中使用ConcurrentHashMap

scala \u4e2d\u600e\u4e48\u4f7f\u7528java\u7684concurrenthashmap\u7c7b

import java.util.concurrent.ConcurrentHashMapval hash = new ConcurrentHashMap[Int,Int]()hash.put(1,100)hash.put(2,200)println(hash)

\u8fd9\u6837\u4f7f\u7528\u662f\u6709\u95ee\u9898\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

参考如下内容:
ConcurrentHashMap锁的方式是稍微细粒度的。 ConcurrentHashMap将hash表分为16个桶(默认值),诸如get,put,remove等常用操作只锁当前需要用到的桶。
试想,原来 只能一个线程进入,现在却能同时16个写线程进入(写线程才需要锁定,而读线程几乎不受限制,之后会提到),并发性的提升是显而易见的。
更令人惊讶的是ConcurrentHashMap的读取并发,因为在读取的大多数时候都没有用到锁定,所以读取操作几乎是完全的并发操作,而写操作锁定的粒度又非常细,比起之前又更加快速(这一点在桶更多时表现得更明显些)。只有在求size等操作时才需要锁定整个表。
而在迭代时,ConcurrentHashMap使用了不同于传统集合的快速失败迭代器的另一种迭代方式,我们称为弱一致迭代器。在这种迭代方式中,当iterator被创建后集合再发生改变就不再是抛出 ConcurrentModificationException,取而代之的是在改变时new新的数据从而不影响原有的数 据,iterator完成后再将头指针替换为新的数据,这样iterator线程可以使用原来老的数据,而写线程也可以并发的完成改变,更重要的,这保证了多个线程并发执行的连续性和扩展性,是性能提升的关键。
下面分析ConcurrentHashMap的源码。主要是分析其中的Segment。因为操作基本上都是在Segment上的。先看Segment内部数据的定义。

  • 鐢↗AVA濡備綍鍒跺仛涓涓畝鍗曠殑鐧诲綍鐣岄潰?灏辨槸鏈夌敤鎴峰悕銆佸瘑鐮併佺‘瀹氬拰鍙栨秷鎸...
    绛旓細<%@ page language="java" import="java.util.*" contentType="text/html;charset=GB2312" import="java.sql.*"%> <%@ page import="com.microsoft.sqlserver.jdbc.SQLServerDriver" %> <%@page import="java.sql.DriverManager"%> <HTML> <HEAD> </HEAD> < String userName=request.getPa...
  • (concude Reference)鏄粈涔堟剰鎬?
    绛旓細璇ユ绠瑕佹爣棰樻病鍐欙紝渚嬪锛氱洰鐨 鏈鑼冧负浜...鑼冨洿 鏈鑼冮傜敤浜 瀹氫箟 ...
  • java涓鏂规硶澹版槑鏃犳晥,闇瑕佽繑鍥炵被鍨
    绛旓細涓锛歱ublic String test(){} ;杩欐牱鐨瀹氫箟灏变細鎶ラ敊闇瑕佽繑鍥炵被鍨嬶紱浜岋細public String test( return "aaa" ){} ; 鍥犱负瀹氫箟鐨勮繑鍥炵被鍨嬫槸瀛楃涓茬被鍨嬶紝鎵浠ュ彧瑕佽繑鍥炰竴涓瓧绗︿覆鍗冲彲銆傚娉細杩斿洖鍊肩被鍨嬪繀椤诲拰瀹氫箟鐨勭被鍨嬩竴鑷达紝鍚﹀垯涔熶細鎶ラ敊銆
  • java 婧愪唬鐮 鍩虹鐐圭殑 璋㈣阿
    绛旓細this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); //璁剧疆鐢ㄦ埛鍦ㄦ绐椾綋涓婂彂璧 "close" 鏃堕粯璁ゆ墽琛岀殑鎿嶄綔,鍙傛暟EXIT_ON_CLOSE鏄娇鐢 System exit 鏂规硶閫鍑哄簲鐢ㄧ▼搴忋備粎鍦ㄥ簲鐢ㄧ▼搴涓娇鐢 this.setSize(300,200); //璁剧疆闈㈡澘澶у皬,瀹藉拰楂 this.setLocation(300,300); //璁剧疆闈㈡澘鍒氬紑濮嬬殑鍑虹幇鐨勪綅缃 Cursor cu ...
  • java搴旂敤绋嬪簭鎬庝箞鎾斁闊充箰?
    绛旓細//first鍊肩敤鏉ユ帶鍒跺湪鍒氬紑濮嬬▼搴忔椂鏄剧ず涓骞呮杩庣晫闈;loop鐢浠ユ爣璁版槸鍚﹀惊鐜挱鏀; boolean first = true, loop = false; //璁剧珛涓涓瓧绗︿覆璁板綍褰撳墠鎵撳紑鏂囦欢鐨璺緞 String currentDirectory; MediaPlayer(String title) { super(title); // 鍒╃敤涓涓猘dapter瀹炵幇瀵圭敤鎴风偣鍑荤獥鍙g郴缁熻彍鍗曠殑鍏抽棴鎸夐挳 // 鏃剁殑鍝嶅簲; addWin...
  • 姹java绠鍗曡绠楀櫒婧愪唬鐮
    绛旓細System.out.println("double鍨鐨b2:"+b2); //璋冭瘯鏃 浣跨敤if (c.equals("+")) { jg2=a2+b2; } if (c.equals("-")) { jg2=a2-b2; } if (c.equals("*")) { jg2=a2*b2; } if (c.equals("/")) { if(b2==0) { jg2=0;//0000000000000 by 0 cu! } else { jg2=a2/b2; }...
  • java杩愯浜嗙▼搴忔病鍙嶅簲
    绛旓細//鏈変釜瀵硅薄textCustSex涓簄ull,鎵浠ユ姤绌烘寚閽堝紓甯革紝澶氳皟璇曟妸~public class Customer extends JFrame { // 澹版槑鏍囩鍙橀噺 JLabel Heading; JLabel labelCustNO; JLabel labelCustName; JLabel labelCustSex; JLabel labelCustAge; // 澹版槑鏁版嵁杈撳叆鎺т欢 JTextField textCustNo; JTextField textCustName; ...
  • java杩愯浜嗙▼搴忔病鍙嶅簲
    绛旓細//鏈変釜瀵硅薄textCustSex涓簄ull,鎵浠ユ姤绌烘寚閽堝紓甯革紝澶氳皟璇曟妸~public class Customer extends JFrame { // 澹版槑鏍囩鍙橀噺 JLabel Heading; JLabel labelCustNO; JLabel labelCustName; JLabel labelCustSex; JLabel labelCustAge; // 澹版槑鏁版嵁杈撳叆鎺т欢 JTextField textCustNo; JTextField textCustName; ...
  • JSP璋冪敤class
    绛旓細//鍋囪浣犵殑绫讳腑鏈変竴涓潤鎬佹柟娉曪細getResult(String a,String b,String c)String result = com.room.Roomview.getResult(a,b,c);/*浠ヤ笂鐨勭被瑕佸啓鍏ㄥ寘鍚嶏紝鎴栬呭湪鏄痡sp椤堕儴瀵煎叆鐢ㄥ埌鐨鍖咃紝濡 <%@ page contentType="text/html; charset=gb2312" language="java"import="com.room.*" errorPage="...
  • java 杩炴帴Mysql 鍑虹幇闂!!
    绛旓細浠庤繖涓敊璇潵鐪嬶紝杩樻槸浣爅ar鍖卪ysql-connector-java-3.2.0-alpha-bin.jar鐨勮矾寰勪笉瀵
  • 扩展阅读:在线crm网站 ... java.52emu.cn ... www.968777.cn ... 免费源码资源源码站入口 ... 私人网站服务器 ... 欧洲vps windows网站 ... 在线linux网站 ... 黑马java视频 ... 小视频网站哪个可以推广 ...

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