hashmap是线程安全吗
发表于:2025-12-03 作者:千家信息网编辑
千家信息网最后更新 2025年12月03日,本篇内容主要讲解"hashmap是线程安全吗",感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习"hashmap是线程安全吗"吧!目前普遍都是使用jdk1.8 了
千家信息网最后更新 2025年12月03日hashmap是线程安全吗
本篇内容主要讲解"hashmap是线程安全吗",感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习"hashmap是线程安全吗"吧!
目前普遍都是使用jdk1.8 了。 其实要模拟jdk1.8的多线程不安全出来,其实很简单的。
复制一份hashmap的代码出来。接着 将 hashmap的容量固定为1 ,并且禁止扩容。
比如: 修改 resize代码。 第一次可以扩展,容量是1。第二次就不可以了。
final Node[] resize() { if (FirstResize.get() !=0){ System.out.println(">>>>不可以扩展>>>"); return table; }else{ FirstResize.addAndGet(1); }
put 方法里面,进行控制线程的调度,就可以模拟了
/** * Implements Map.put and related methods * * @param hash hash for key * @param key the key * @param value the value to put * @param onlyIfAbsent if true, don't change existing value * @param evict if false, the table is in creation mode. * @return previous value, or null if none */ final V putVal(int hash, K key, V value, boolean onlyIfAbsent, boolean evict) { Node[] tab; Node p; int n, i; if ((tab = table) == null || (n = tab.length) == 0) n = (tab = resize()).length; if ((p = tab[i = (n - 1) & hash]) == null){ // 多线程并发,会发生 数据覆盖 if (Thread.currentThread().getName().equals("a")){ System.out.println("线程A休眠,暂停执行"); //模拟, 让其覆盖 其他线程 的值 try { Thread.sleep(5*1000); } catch (InterruptedException e) { e.printStackTrace(); } } System.out.println("i >>>>"+i); System.out.println("插入:"+key +": "+value); tab[i] = newNode(hash, key, value, null); } else { Node e; K k; if (p.hash == hash && ((k = p.key) == key || (key != null && key.equals(k)))) e = p; else if (p instanceof TreeNode) e = ((TreeNode)p).putTreeVal(this, tab, hash, key, value); else { for (int binCount = 0; ; ++binCount) { if ((e = p.next) == null) { //同理也会 发生并发 put的时候被覆盖的情况 p.next = newNode(hash, key, value, null); if (binCount >= TREEIFY_THRESHOLD - 1) // -1 for 1st treeifyBin(tab, hash); break; } if (e.hash == hash && ((k = e.key) == key || (key != null && key.equals(k)))) break; p = e; } } if (e != null) { // existing mapping for key V oldValue = e.value; if (!onlyIfAbsent || oldValue == null) e.value = value; afterNodeAccess(e); return oldValue; } } ++modCount; if (++size > threshold) resize(); afterNodeInsertion(evict); return null; } 测试代码:
package com.interview.javabasic.myhashmap;import java.util.Map;import java.util.concurrent.atomic.AtomicInteger;public class TestThreadMap { private static HashMap mh=new HashMap(1); public static void main(String[] args) { HashMapThread thread0 = new HashMapThread("a",mh); HashMapThread thread1 = new HashMapThread("b",mh); thread0.start(); thread1.start(); try { Thread.sleep(15*1000); } catch (InterruptedException e) { e.printStackTrace(); } // 此时会发现 map 里面 只有 2,2 。 // mh.put(3,3); 被覆盖了 System.out.println(mh); }}class HashMapThread extends Thread { HashMap mh; private String namet; public HashMapThread(String name, HashMap mh) { super(name); this.namet=name; this.mh=mh; } @Override public void run() { if (namet.equals("b")){ try { Thread.sleep(2*1000); } catch (InterruptedException e) { e.printStackTrace(); } mh.put(3,3); }else{ mh.put(2,2); } }} 到此,相信大家对"hashmap是线程安全吗"有了更深的了解,不妨来实际操作一番吧!这里是网站,更多相关内容可以进入相关频道进行查询,关注我们,继续学习!
线程
安全
代码
内容
容量
方法
学习
实用
更深
不安
兴趣
只有
实用性
实际
情况
操作简单
数据
时候
更多
朋友
数据库的安全要保护哪些东西
数据库安全各自的含义是什么
生产安全数据库录入
数据库的安全性及管理
数据库安全策略包含哪些
海淀数据库安全审计系统
建立农村房屋安全信息数据库
易用的数据库客户端支持安全管理
连接数据库失败ssl安全错误
数据库的锁怎样保障安全
郑州软件开发价格走势
网络安全知识绘画简单手抄报
河南省网络安全项目
重庆统一软件开发品质保障
网页输入数据保存不到数据库
女生适合学习计算机网络技术
如何下载原神官方服务器
工控网络安全抽查
无线网络安全性低什么意思
哪些产品需要运动控制软件开发
安徽共享软件开发公司
平安金融网络安全吗
软科学成果数据库
职校网络技术专业
数据库与网络服务器的关系
网络安全手抄
网络安全保卫大队工作情况
亚马逊数据库怎么迁移
云服务器开启端口
网络技术客服前景
软件开发本质论值钱吗
2020软件开发的前景
网络安全宣传周新城区
什么地方学数据库
CDMA网络安全ppt
汕头 戴尔维修服务器
数据库与网络服务器的关系
sql数据库模糊查询
网络技术对金融效率
执法局网络安全落实情况报告