Java并发多线程编程——集合类线程不安全之HashMap的示例及解决方案
Posted 小志的博客
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Java并发多线程编程——集合类线程不安全之HashMap的示例及解决方案相关的知识,希望对你有一定的参考价值。
目录
一、集合类HashMap线程不安全的代码示例
-
代码
import java.util.*; /** * @description: HashMap线程不安全的代码示例 * @author: xz */ public class ContainerNotSafe public static void main(String[] args) Map<String,String> map=new HashMap<>(); //模拟30个线程,往HashMap集合中添加数据 for(int i=1;i<=30;i++) new Thread(()-> map.put(Thread.currentThread().getName(),UUID.randomUUID().toString().substring(0,8)); System.out.println(map); ).start();
-
输出结果如下:
二、集合类HashMap线程不安全的故障现象
- 报 java.util.ConcurrentModificationException 异常错误
三、集合类HashMap线程不安全的原因
- 并发争抢修改导致报 java.util.ConcurrentModificationException 异常错误。
四、集合类HashMap线程不安全的解决方案
4.1、解决方式一:通过Collections工具类解决
-
代码
import java.util.*; /** * @description: 通过Collections工具类解决集合类HashMap线程不安全问题 * @author: xz */ public class ContainerNotSafe public static void main(String[] args) Map<String,String> map=Collections.synchronizedMap(new HashMap<>()); //模拟30个线程,往synchronizedMap集合中添加数据 for(int i=1;i<=30;i++) new Thread(()-> map.put(Thread.currentThread().getName(),UUID.randomUUID().toString().substring(0,8)); System.out.println(map); ).start();
-
输出结果如下:
4.2、解决方式二:通过JUC包下的并发集合类解决
-
jdk1.8 API中的并发集合类截图如下:
-
代码
import java.util.*; import java.util.concurrent.ConcurrentHashMap; /** * @description: 通过JUC包下的并发集合类解决HashMap线程不安全问题 * @author: xz */ public class ContainerNotSafe public static void main(String[] args) Map<String,String> map=new ConcurrentHashMap<>(); //模拟30个线程,往synchronizedMap集合中添加数据 for(int i=1;i<=30;i++) new Thread(()-> map.put(Thread.currentThread().getName(),UUID.randomUUID().toString().substring(0,8)); System.out.println(map); ).start();
-
输出结果如下:
五、ConcurrentHashMap线程安全的源码解析
- ConcurrentHashMap线程安全集合类的源码解析,请参考lz此博文链接:
https://blog.csdn.net/li1325169021/article/details/121310896
以上是关于Java并发多线程编程——集合类线程不安全之HashMap的示例及解决方案的主要内容,如果未能解决你的问题,请参考以下文章
Java并发多线程编程——集合类线程不安全之ArrayList的示例及解决方案
JUC并发编程 共享模式之工具 JUC 线程安全的集合类 -- 线程安全的集合类概述