HashMap为什么是线程不安全的?-创新互联

问题:HashMap为什么线程不安全?

在高淳等地区,都构建了全面的区域性战略布局,加强发展的系统性、市场前瞻性、产品创新能力,以专注、极致的服务理念,为客户提供网站制作、网站建设 网站设计制作定制网站开发,公司网站建设,企业网站建设,成都品牌网站建设,成都全网营销推广,外贸网站建设,高淳网站建设费用合理。

一、hash碰撞导致
HashMap的底层存储结构,HashMap底层是一个Entry数组(键值对),一旦发生Hash冲突的的时候,HashMap采用拉链法解决碰撞冲突,Entry内部的变量:

final Object key;
Object value;
Entry next;
int hash;

通过Entry内部的next变量可以知道使用的是链表,这时候我们可以知道,如果多个线程,在某一时刻同时操作HashMap并执行put操作,而有大于两个key的hash值相同,这个时候需要解决碰撞冲突,而解决冲突的办法另一篇已经说过(线性探测法+拉链桶),对于链表的结构在这里不再赘述,暂且不讨论是从链表头部插入还是从尾部初入,这个时候两个线程如果恰好都取到了对应位置的头结点e1,而最终的结果可想而知,a1、a2两个数据中势必会有一个会丢失,再来看下put方法不是同步的

public Object put(Object obj, Object obj1)  
    {  
        if(table == EMPTY_TABLE)  
            inflateTable(threshold);  
        if(obj == null)  
            return putForNullKey(obj1);  
        int i = hash(obj); //位置 
        int j = indexFor(i, table.length);  
        for(Entry entry = table[j]; entry != null; entry = entry.next)  
        {  
            Object obj2;  
            if(entry.hash == i && ((obj2 = entry.key) == obj || obj.equals(obj2)))  
            {  
                Object obj3 = entry.value;  
                entry.value = obj1;  
                entry.recordAccess(this);  
                return obj3;//返回的是旧value(元素)  
            }  
        }  

        modCount++;  
        addEntry(i, obj, obj1, j);  
        return null;  
    }


二、扩容导致

HashMap存在扩容也是HashMap非线程安全的原因:

void resize(int i)  
    {  
        Entry aentry[] = table;  
        int j = aentry.length;  
        if(j == 1073741824)  
        {  
            threshold = 2147483647;  
            return;  
        } else  
        {  
            Entry aentry1[] = new Entry[i];  
            transfer(aentry1, initHashSeedAsNeeded(i));  
            table = aentry1;  
            threshold = (int)Math.min((float)i * loadFactor, 1.073742E+009F);  
            return;  
        }  
    }

另外有需要云服务器可以了解下创新互联scvps.cn,海内外云服务器15元起步,三天无理由+7*72小时售后在线,公司持有idc许可证,提供“云服务器、裸金属服务器、高防服务器、香港服务器、美国服务器、虚拟主机、免备案服务器”等云主机租用服务以及企业上云的综合解决方案,具有“安全稳定、简单易用、服务可用性高、性价比高”等特点与优势,专为企业上云打造定制,能够满足用户丰富、多元化的应用场景需求。

网页标题:HashMap为什么是线程不安全的?-创新互联
网站路径:https://www.cdcxhl.com/article36/dhdipg.html

成都网站建设公司_创新互联,为您提供外贸网站建设云服务器域名注册做网站用户体验自适应网站

广告

声明:本网站发布的内容(图片、视频和文字)以用户投稿、用户转载内容为主,如果涉及侵权请尽快告知,我们将会在第一时间删除。文章观点不代表本网站立场,如需处理请联系客服。电话:028-86922220;邮箱:631063699@qq.com。内容未经允许不得转载,或转载时需注明来源: 创新互联

网站建设网站维护公司