<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;">