{"id":3962,"date":"2024-05-05T09:00:30","date_gmt":"2024-05-05T01:00:30","guid":{"rendered":"https:\/\/xinchewhd.com.cn\/index.php\/java\/%e9%9d%a2%e8%af%95%e5%ae%98%ef%bc%9aconcurrenthashmap%e5%85%81%e8%ae%b8%e5%a4%9a%e5%b0%91%e4%b8%aa%e7%ba%bf%e7%a8%8b%e5%90%8c%e6%97%b6%e5%86%99%e5%85%a5%ef%bc%9f\/"},"modified":"2024-05-24T15:11:59","modified_gmt":"2024-05-24T07:11:59","slug":"%e9%9d%a2%e8%af%95%e5%ae%98%ef%bc%9aconcurrenthashmap%e5%85%81%e8%ae%b8%e5%a4%9a%e5%b0%91%e4%b8%aa%e7%ba%bf%e7%a8%8b%e5%90%8c%e6%97%b6%e5%86%99%e5%85%a5%ef%bc%9f","status":"publish","type":"post","link":"https:\/\/xinchewhd.com.cn\/index.php\/java\/%e9%9d%a2%e8%af%95%e5%ae%98%ef%bc%9aconcurrenthashmap%e5%85%81%e8%ae%b8%e5%a4%9a%e5%b0%91%e4%b8%aa%e7%ba%bf%e7%a8%8b%e5%90%8c%e6%97%b6%e5%86%99%e5%85%a5%ef%bc%9f\/","title":{"rendered":"\u9762\u8bd5\u5b98\uff1aConcurrentHashMap\u5141\u8bb8\u591a\u5c11\u4e2a\u7ebf\u7a0b\u540c\u65f6\u5199\u5165\uff1f"},"content":{"rendered":"<div class=\"wxsyncmain\">\n<p data-v-md-line=\"1\"><span style=\"font-size: 16px;\">ConcurrentHashMap \u5728 Java \u4e2d\u662f\u4e00\u4e2a\u7ebf\u7a0b\u5b89\u5168\u7684\u54c8\u5e0c\u8868\uff0c\u5b83\u901a\u8fc7\u5206\u6bb5\u9501\uff08segmentation\uff09\u7684\u65b9\u5f0f\u51cf\u5c11\u9501\u7ade\u4e89\uff0c\u4ece\u800c\u5141\u8bb8\u591a\u4e2a\u7ebf\u7a0b\u540c\u65f6\u5199\u5165\u3002\u5728 Java 8 \u53ca\u4ee5\u540e\u7684\u7248\u672c\u4e2d\uff0c\u5bf9\u8fd9\u4e2a\u7c7b\u7684\u5185\u90e8\u5b9e\u73b0\u8fdb\u884c\u4e86\u91cd\u5927\u6539\u8fdb\uff0c\u6452\u5f03\u4e86\u539f\u6709\u7684Segment\u6570\u7ec4\uff0c\u8f6c\u800c\u91c7\u7528\u4e86\u4e00\u79cd\u5206\u6563\u6570\u7ec4+\u94fe\u8868+\u7ea2\u9ed1\u6811\u7684\u7ed3\u6784\uff0c\u5e76\u5f15\u5165\u4e86CAS\u64cd\u4f5c\uff08Compare-And-Swap\uff09\u3001synchronized\u4ee5\u53cavolatile\u7b49\u5e76\u53d1\u63a7\u5236\u673a\u5236\u6765\u4fdd\u8bc1\u7ebf\u7a0b\u5b89\u5168\u3002<\/span><\/p>\n<p data-v-md-line=\"3\"><span style=\"font-size: 16px;\">\u5728 JDK 1.8 \u53ca\u4e4b\u540e\u7684 ConcurrentHashMap \u5b9e\u73b0\u4e2d\uff0c\u5e76\u6ca1\u6709\u660e\u786e\u9650\u5236\u540c\u65f6\u5199\u5165\u7684\u7ebf\u7a0b\u6570\u91cf\u3002\u76f8\u53cd\uff0c\u5b83\u4f7f\u7528\u4e86\u4e00\u79cd\u66f4\u7cbe\u7ec6\u5316\u7684\u9501\u5b9a\u7b56\u7565\u2014\u2014\u4ec5\u5728\u9700\u8981\u65f6\u9501\u5b9a\u67d0\u4e9b\u6876\uff08bucket\uff09\u6216\u8282\u70b9\u3002\u5f53\u591a\u4e2a\u7ebf\u7a0b\u5c1d\u8bd5\u66f4\u65b0\u4e0d\u540c\u7684\u6876\u65f6\uff0c\u5b83\u4eec\u53ef\u4ee5\u5e76\u884c\u5730\u8fdb\u884c\uff0c\u4e0d\u4f1a\u5f7c\u6b64\u5e72\u6270\u3002\u4f46\u662f\uff0c\u5982\u679c\u591a\u4e2a\u7ebf\u7a0b\u5c1d\u8bd5\u66f4\u65b0\u540c\u4e00\u4e2a\u6876\u5185\u7684\u8282\u70b9\uff0c\u90a3\u4e48\u53ef\u80fd\u4f1a\u5b58\u5728\u4e00\u4e9b\u4e89\u7528\uff0c\u5177\u4f53\u53d6\u51b3\u4e8e\u8282\u70b9\u7684\u72b6\u6001\u548c\u6b63\u5728\u6267\u884c\u7684\u64cd\u4f5c\u3002<\/span><\/p>\n<p style=\"text-align: left;\" data-v-md-line=\"5\"><span style=\"font-size: 16px;\">\u4ee5\u4e0b\u662f\u7b80\u5316\u7684\u6e90\u7801\u903b\u8f91\u5206\u6790\uff0c\u57fa\u4e8e Java 8 \u53ca\u4ee5\u4e0a\u7248\u672cConcurrentHashMap\uff1a<\/span><\/p>\n<section class=\"code-snippet__fix code-snippet__js\">\n<pre class=\"code-snippet__js\" data-lang=\"cs\"><code><span class=\"code-snippet_outer\"><span class=\"code-snippet__function\"><span class=\"code-snippet__keyword\">public<\/span> V <span class=\"code-snippet__title\">put<\/span>(<span class=\"code-snippet__params\">K key, V <span class=\"code-snippet__keyword\">value<\/span><\/span>)<\/span> {<\/span><\/code><code><span class=\"code-snippet_outer\">    <span class=\"code-snippet__keyword\">return<\/span> putVal(key, <span class=\"code-snippet__keyword\">value<\/span>, <span class=\"code-snippet__literal\">false<\/span>);<\/span><\/code><code><span class=\"code-snippet_outer\">}<\/span><\/code><code><\/code><code><span class=\"code-snippet_outer\"><span class=\"code-snippet__function\">final V <span class=\"code-snippet__title\">putVal<\/span>(<span class=\"code-snippet__params\">K key, V <span class=\"code-snippet__keyword\">value<\/span>, boolean onlyIfAbsent<\/span>)<\/span> {<\/span><\/code><code><span class=\"code-snippet_outer\">    <span class=\"code-snippet__keyword\">if<\/span> (key == <span class=\"code-snippet__literal\">null<\/span> || <span class=\"code-snippet__keyword\">value<\/span> == <span class=\"code-snippet__literal\">null<\/span>) <span class=\"code-snippet__keyword\">throw<\/span> <span class=\"code-snippet__keyword\">new<\/span> NullPointerException();<\/span><\/code><code><span class=\"code-snippet_outer\">    <span class=\"code-snippet__keyword\">int<\/span> hash = spread(key.hashCode());<\/span><\/code><code><span class=\"code-snippet_outer\">    <span class=\"code-snippet__keyword\">int<\/span> binCount = <span class=\"code-snippet__number\">0<\/span>;<\/span><\/code><code><span class=\"code-snippet_outer\">    <span class=\"code-snippet__keyword\">for<\/span> (Node&lt;K,V&gt;[] tab = table;;) {<\/span><\/code><code><span class=\"code-snippet_outer\">        Node&lt;K,V&gt; f; <span class=\"code-snippet__keyword\">int<\/span> n, i, fh; K fk; V fv;<\/span><\/code><code><span class=\"code-snippet_outer\">        <span class=\"code-snippet__keyword\">if<\/span> (tab == <span class=\"code-snippet__literal\">null<\/span> || (n = tab.length) == <span class=\"code-snippet__number\">0<\/span>)<\/span><\/code><code><span class=\"code-snippet_outer\">            tab = initTable();<\/span><\/code><code><span class=\"code-snippet_outer\">        <span class=\"code-snippet__keyword\">else<\/span> <span class=\"code-snippet__keyword\">if<\/span> ((f = tabAt(tab, i = (n - <span class=\"code-snippet__number\">1<\/span>) &amp; hash)) == <span class=\"code-snippet__literal\">null<\/span>) {<\/span><\/code><code><span class=\"code-snippet_outer\">            <span class=\"code-snippet__keyword\">if<\/span> (casTabAt(tab, i, <span class=\"code-snippet__literal\">null<\/span>,<\/span><\/code><code><span class=\"code-snippet_outer\">                         <span class=\"code-snippet__keyword\">new<\/span> Node&lt;K,V&gt;(hash, key, <span class=\"code-snippet__keyword\">value<\/span>, <span class=\"code-snippet__literal\">null<\/span>)))<\/span><\/code><code><span class=\"code-snippet_outer\">                <span class=\"code-snippet__keyword\">break<\/span>;                   <span class=\"code-snippet__comment\">\/\/ no lock when adding to empty bin<\/span><\/span><\/code><code><span class=\"code-snippet_outer\">        }<\/span><\/code><code><span class=\"code-snippet_outer\">        <span class=\"code-snippet__keyword\">else<\/span> <span class=\"code-snippet__keyword\">if<\/span> ((fh = f.hash) == MOVED)<\/span><\/code><code><span class=\"code-snippet_outer\">            tab = helpTransfer(tab, f);<\/span><\/code><code><span class=\"code-snippet_outer\">        <span class=\"code-snippet__keyword\">else<\/span> {<\/span><\/code><code><span class=\"code-snippet_outer\">            V oldVal = <span class=\"code-snippet__literal\">null<\/span>;<\/span><\/code><code><span class=\"code-snippet_outer\">            synchronized (f) {<\/span><\/code><code><span class=\"code-snippet_outer\">                <span class=\"code-snippet__keyword\">if<\/span> (tabAt(tab, i) == f) {<\/span><\/code><code><span class=\"code-snippet_outer\">                    <span class=\"code-snippet__keyword\">if<\/span> (fh &gt;= <span class=\"code-snippet__number\">0<\/span>) {<\/span><\/code><code><span class=\"code-snippet_outer\">                        binCount = <span class=\"code-snippet__number\">1<\/span>;<\/span><\/code><code><span class=\"code-snippet_outer\">                        <span class=\"code-snippet__keyword\">for<\/span> (Node&lt;K,V&gt; e = f;; ++binCount) {<\/span><\/code><code><span class=\"code-snippet_outer\">                            K ek;<\/span><\/code><code><span class=\"code-snippet_outer\">                            <span class=\"code-snippet__keyword\">if<\/span> (e.hash == hash &amp;&amp;<\/span><\/code><code><span class=\"code-snippet_outer\">                                ((ek = e.key) == key ||<\/span><\/code><code><span class=\"code-snippet_outer\">                                 (ek != <span class=\"code-snippet__literal\">null<\/span> &amp;&amp; key.<span class=\"code-snippet__keyword\">equals<\/span>(ek)))) {<\/span><\/code><code><span class=\"code-snippet_outer\">                                oldVal = e.val;<\/span><\/code><code><span class=\"code-snippet_outer\">                                <span class=\"code-snippet__keyword\">if<\/span> (!onlyIfAbsent)<\/span><\/code><code><span class=\"code-snippet_outer\">                                    e.val = <span class=\"code-snippet__keyword\">value<\/span>;<\/span><\/code><code><span class=\"code-snippet_outer\">                                <span class=\"code-snippet__keyword\">break<\/span>;<\/span><\/code><code><span class=\"code-snippet_outer\">                            }<\/span><\/code><code><span class=\"code-snippet_outer\">                            Node&lt;K,V&gt; pred = e;<\/span><\/code><code><span class=\"code-snippet_outer\">                            <span class=\"code-snippet__keyword\">if<\/span> ((e = e.next) == <span class=\"code-snippet__literal\">null<\/span>) {<\/span><\/code><code><span class=\"code-snippet_outer\">                                pred.next = <span class=\"code-snippet__keyword\">new<\/span> Node&lt;K,V&gt;(hash, key, <span class=\"code-snippet__keyword\">value<\/span>, <span class=\"code-snippet__literal\">null<\/span>);<\/span><\/code><code><span class=\"code-snippet_outer\">                                <span class=\"code-snippet__keyword\">break<\/span>;<\/span><\/code><code><span class=\"code-snippet_outer\">                            }<\/span><\/code><code><span class=\"code-snippet_outer\">                        }<\/span><\/code><code><span class=\"code-snippet_outer\">                    }<\/span><\/code><code><span class=\"code-snippet_outer\">                    <span class=\"code-snippet__keyword\">else<\/span> <span class=\"code-snippet__keyword\">if<\/span> (f instanceof TreeBin) {<\/span><\/code><code><span class=\"code-snippet_outer\">                        ...<\/span><\/code><code><span class=\"code-snippet_outer\">                        <span class=\"code-snippet__comment\">\/\/ Tree bins are handled differently<\/span><\/span><\/code><code><span class=\"code-snippet_outer\">                    }<\/span><\/code><code><span class=\"code-snippet_outer\">                }<\/span><\/code><code><span class=\"code-snippet_outer\">            }<\/span><\/code><code><span class=\"code-snippet_outer\">            <span class=\"code-snippet__keyword\">if<\/span> (binCount != <span class=\"code-snippet__number\">0<\/span>) {<\/span><\/code><code><span class=\"code-snippet_outer\">                <span class=\"code-snippet__keyword\">if<\/span> (binCount &gt;= TREEIFY_THRESHOLD)<\/span><\/code><code><span class=\"code-snippet_outer\">                    treeifyBin(tab, i);<\/span><\/code><code><span class=\"code-snippet_outer\">                <span class=\"code-snippet__keyword\">if<\/span> (oldVal != <span class=\"code-snippet__literal\">null<\/span>)<\/span><\/code><code><span class=\"code-snippet_outer\">                    <span class=\"code-snippet__keyword\">return<\/span> oldVal;<\/span><\/code><code><span class=\"code-snippet_outer\">                <span class=\"code-snippet__keyword\">break<\/span>;<\/span><\/code><code><span class=\"code-snippet_outer\">            }<\/span><\/code><code><span class=\"code-snippet_outer\">        }<\/span><\/code><code><span class=\"code-snippet_outer\">    }<\/span><\/code><code><span class=\"code-snippet_outer\">    addCount(<span class=\"code-snippet__number\">1L<\/span>, binCount);<\/span><\/code><code><span class=\"code-snippet_outer\">    <span class=\"code-snippet__keyword\">return<\/span> <span class=\"code-snippet__literal\">null<\/span>;<\/span><\/code><code><span class=\"code-snippet_outer\">}<\/span><\/code><\/pre>\n<\/section>\n<p data-v-md-line=\"70\"><span style=\"font-size: 16px;\">\u4e0a\u9762\u7684\u4ee3\u7801\u5c55\u793a\u4e86 put()\u65b9\u6cd5\u7684\u5de5\u4f5c\u6d41\u7a0b\u3002<\/span><\/p>\n<ul class=\"list-paddingleft-1\" data-v-md-line=\"72\">\n<li><span style=\"font-size: 16px;\">spread()\u65b9\u6cd5\u7528\u4e8e\u5c06 hashCode()\u83b7\u5f97\u7684\u9ad8\u4f4d\u53c2\u4e0e\u5230\u4f4e\u4f4d\u7684\u8ba1\u7b97\u4e2d\uff0c\u4ee5\u964d\u4f4e\u78b0\u649e\u7684\u6982\u7387\u3002<\/span><\/li>\n<li><span style=\"font-size: 16px;\">casTabAt()\u662f\u57fa\u4e8e CAS \u64cd\u4f5c\u7684\u975e\u963b\u585e\u7b97\u6cd5\uff0c\u786e\u4fdd\u65e0\u5176\u4ed6\u7ebf\u7a0b\u5199\u5165\u65f6\u5373\u523b\u6210\u529f\u3002<\/span><\/li>\n<li><span style=\"font-size: 16px;\">synchronized(f)\u9501\u5b9a\u5f53\u524d\u6876\u7684\u7b2c\u4e00\u4e2a\u8282\u70b9\uff0c\u5982\u679c\u591a\u4e2a\u7ebf\u7a0b\u64cd\u4f5c\u540c\u4e00\u4e2a\u6876\uff0c\u5c06\u4f1a\u4ea7\u751f\u7ade\u4e89\u3002<\/span><\/li>\n<\/ul>\n<section style=\"margin-top: 24px;\"><strong><span style=\"font-size: 16px;\">\u603b\u7ed3<\/span><\/strong><span style=\"font-size: 16px;\">\uff1aConcurrentHashMap \u5141\u8bb8\u591a\u4e2a\u7ebf\u7a0b\u5e76\u53d1\u5199\u5165\uff0c\u4f46\u5177\u4f53\u7684\u5e76\u884c\u5ea6\u53d6\u51b3\u4e8e\u5f53\u524d\u6876\u7684\u4e89\u7528\u60c5\u51b5\u3002\u5982\u679c\u591a\u4e2a\u7ebf\u7a0b\u66f4\u65b0\u4e0d\u540c\u7684\u6876\uff0c\u5219\u53ef\u4ee5\u5b8c\u5168\u5e76\u884c\uff1b\u5982\u679c\u5b83\u4eec\u66f4\u65b0\u76f8\u540c\u6876\u4e2d\u7684\u4e0d\u540c\u8282\u70b9\uff08\u5728Java 8\u53ca\u4ee5\u540e\uff09\uff0c\u90a3\u4e48\u7531\u4e8e\u7ec6\u7c92\u5ea6\u7684\u9501\u5b9a\uff0c\u901a\u5e38\u5b83\u4eec\u4e5f\u53ef\u4ee5\u5e76\u884c\u8fdb\u884c\uff0c\u9664\u975e\u8fd9\u4e9b\u8282\u70b9\u90fd\u4f4d\u4e8e\u76f8\u540c\u7684\u4f4d\u7f6e\uff0c\u5982\u540c\u4e00\u94fe\u8868\u6216\u6811\u7684\u90e8\u5206\u3002\u56e0\u6b64\uff0c\u5e76\u6ca1\u6709\u56fa\u5b9a\u7684\u201c\u5141\u8bb8\u591a\u5c11\u4e2a\u7ebf\u7a0b\u540c\u65f6\u5199\u5165\u201d\u7684\u6570\u5b57\uff0c\u8fd9\u4e2a\u6570\u5b57\u662f\u52a8\u6001\u7684\uff0c\u4f9d\u8d56\u4e8e\u5177\u4f53\u7684\u7ade\u4e89\u6761\u4ef6\u548c\u6876\u7684\u7ed3\u6784\u3002<\/span><\/section>\n<p style=\"display: none;\">\n<blockquote><p>\u672c\u7bc7\u6587\u7ae0\u6765\u6e90\u4e8e\u5fae\u4fe1\u516c\u4f17\u53f7: \u4e92\u8054\u7f51\u9762\u8bd5\u5c0f\u5e2e\u624b<\/p><\/blockquote>\n<\/div>\n","raw":"","protected":false},"excerpt":{"rendered":"<p>ConcurrentHashMap \u5728 Java \u4e2d\u662f\u4e00\u4e2a\u7ebf\u7a0b\u5b89\u5168\u7684\u54c8\u5e0c\u8868\uff0c\u5b83\u901a\u8fc7\u5206\u6bb5\u9501\uff08segmentation\uff09\u7684\u65b9\u5f0f\u51cf\u5c11\u9501\u7ade &#8230;<\/p>\n","protected":false},"author":1,"featured_media":3959,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"emotion":"","emotion_color":"","title_style":"","license":"","footnotes":""},"categories":[2],"tags":[],"class_list":["post-3962","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-java"],"post_thumbnail_image":"https:\/\/wp-moto-1258805347.cos.ap-shanghai.myqcloud.com\/2024\/05\/20240524143953127-150x150.jpeg","content_first_image":null,"post_medium_image_300":"https:\/\/wp-moto-1258805347.cos.ap-shanghai.myqcloud.com\/2024\/05\/20240524143953127-300x128.jpeg","post_thumbnail_image_624":"https:\/\/wp-moto-1258805347.cos.ap-shanghai.myqcloud.com\/2024\/05\/20240524143953127-1024x435.jpeg","post_frist_image":null,"post_medium_image":"https:\/\/wp-moto-1258805347.cos.ap-shanghai.myqcloud.com\/2024\/05\/20240524143953127-300x128.jpeg","post_large_image":"https:\/\/wp-moto-1258805347.cos.ap-shanghai.myqcloud.com\/2024\/05\/20240524143953127-1024x435.jpeg","post_full_image":"https:\/\/wp-moto-1258805347.cos.ap-shanghai.myqcloud.com\/2024\/05\/20240524143953127.jpeg","post_all_images":[],"videoAdId":"","listAd":"0","listAdId":"","listAdEvery":6,"total_comments":0,"category_name":"Java","post_date":"2024-05-05","like_count":"0","praiseWord":"\u9f13\u52b1","copyright_state":"","excitationAd":"0","rewardedVideoAdId":"","detailAdId":"","detailAd":"0","enterpriseMinapp":"0","audios":[],"postImageUrl":"https:\/\/wp-moto-1258805347.cos.ap-shanghai.myqcloud.com\/2023\/05\/20230519082947553.jpg","avatarurls":[],"related_posts":null,"pageviews":328,"next_post_id":3852,"next_post_title":"\u5b57\u8282\u4e00\u9762\uff1aPOST \u4e3a\u4ec0\u4e48\u4f1a\u53d1\u9001\u4e24\u6b21\u8bf7\u6c42\uff1f","previous_post_id":3844,"previous_post_title":"ThreadLocal\u5b66\u4e60\u5723\u7ecf\uff1a\u4e00\u6587\u7a7f\u900fTL\u3001 ITL\u3001TTL\u3001FTL\uff0c\u7a7f\u900fThreadLocal \u5185\u5b58\u6cc4\u6f0f","_links":{"self":[{"href":"https:\/\/xinchewhd.com.cn\/index.php\/wp-json\/wp\/v2\/posts\/3962","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/xinchewhd.com.cn\/index.php\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/xinchewhd.com.cn\/index.php\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/xinchewhd.com.cn\/index.php\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/xinchewhd.com.cn\/index.php\/wp-json\/wp\/v2\/comments?post=3962"}],"version-history":[{"count":1,"href":"https:\/\/xinchewhd.com.cn\/index.php\/wp-json\/wp\/v2\/posts\/3962\/revisions"}],"predecessor-version":[{"id":4183,"href":"https:\/\/xinchewhd.com.cn\/index.php\/wp-json\/wp\/v2\/posts\/3962\/revisions\/4183"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/xinchewhd.com.cn\/index.php\/wp-json\/wp\/v2\/media\/3959"}],"wp:attachment":[{"href":"https:\/\/xinchewhd.com.cn\/index.php\/wp-json\/wp\/v2\/media?parent=3962"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/xinchewhd.com.cn\/index.php\/wp-json\/wp\/v2\/categories?post=3962"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/xinchewhd.com.cn\/index.php\/wp-json\/wp\/v2\/tags?post=3962"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}