加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Java > 正文

HashMap为什么是线程不安全的?

发布时间:2020-12-14 06:37:15 所属栏目:Java 来源:网络整理
导读:p style="color:rgb(51,51,51);font-family:Arial;font-size:14px;"一直以来只是知道HashMap是线程不安全的,但是到底HashMap为什么线程不安全,多线程并发的时候在什么情况下可能出现问题? p style="color:rgb(51,51);font-family:Arial;font-size:14px;"H

<p style="color:rgb(51,51,51);font-family:Arial;font-size:14px;">一直以来只是知道HashMap是线程不安全的,但是到底HashMap为什么线程不安全,多线程并发的时候在什么情况下可能出现问题?


<p style="color:rgb(51,51);font-family:Arial;font-size:14px;">HashMap底层是一个Entry数组,当发生hash冲突的时候,hashmap是采用链表的方式来解决的,在对应的数组位置存放链表的头结点。对链表而言,新加入的节点会从头结点加入。


<p style="color:rgb(51,51);font-family:Arial;font-size:14px;">javadoc中关于hashmap的一段描述如下:


<p style="color:rgb(51,51);font-family:Arial;font-size:14px;">


<p style="color:rgb(51,51);font-size:14px;font-family:Simsun;">此实现不是同步的。如果多个线程同时访问一个哈希映射,而其中至少一个线程从结构上修改了该映射,则它必须?保持外部同步。(结构上的修改是指添加或删除一个或多个映射关系的任何操作;仅改变与实例已经包含的键关联的值不是结构上的修改。)这一般通过对自然封装该映射的对象进行同步操作来完成。如果不存在这样的对象,则应该使用?<a href="http://www.ostools.net/uploads/apidocs/jdk-zh/java/util/Collections.html#synchronizedMap(java.util.Map)" rel="nofollow" style="color:rgb(51,102,153);text-decoration:none;">Collections.synchronizedMap?方法来“包装”该映射。最好在创建时完成这一操作,以防止对映射进行意外的非同步访问,如下所示:


<pre style="color:rgb(51,51);font-size:14px;"> Map m = Collections.synchronizedMap(new HashMap(...));
<br style="color:rgb(51,51);font-family:Arial;font-size:14px;"><p style="color:rgb(51,51);font-family:Arial;font-size:14px;">


<p style="color:rgb(51,51);font-family:Arial;font-size:14px;">1、


<p style="color:rgb(51,51);font-family:Arial;font-size:14px;">


<div class="dp-highlighter bg_java" style="font-family:Consolas,'Courier New',Courier,mono,serif;color:rgb(51,51);">
<div class="bar">
<div class="tools" style="font-size:9px;line-height:normal;font-family:Verdana,Geneva,Arial,Helvetica,sans-serif;color:#C0C0C0;border-left-width:3px;border-left-style:solid;border-left-color:rgb(108,226,108);">
[java]?<a href="http://blog.csdn.net/mydreamongo/article/details/8960667#" rel="nofollow" class="ViewSource" title="view plain" style="color:rgb(160,160,160);text-decoration:none;border:none;display:inline-block;width:16px;text-indent:-2000px;">view
plain?<a href="http://blog.csdn.net/mydreamongo/article/details/8960667#" rel="nofollow" class="CopyToClipboard" title="copy" style="color:rgb(160,160);text-decoration:none;border:none;display:inline-block;width:16px;text-indent:-2000px;">copy
<div style="width:18px;z-index:99;">

  1. ?e?=?table[bucketIndex];??
  2. (hash,?key,?value,?e);??
  3. =?threshold)??

?removeEntryForKey(Object?key)?{??

  • ?prev?=?table[i];??
  • ?e?=?prev;??
  • ?next?=?e.next;??

  • (编辑:李大同)

    【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

      推荐文章
        热点阅读