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线程安全的源码解析

以上是关于Java并发多线程编程——集合类线程不安全之HashMap的示例及解决方案的主要内容,如果未能解决你的问题,请参考以下文章

Java并发多线程编程——集合类线程不安全之ArrayList的示例及解决方案

JUC并发编程 共享模式之工具 JUC 线程安全的集合类 -- 线程安全的集合类概述

Java并发编程之set集合的线程安全类你知道吗

多线程编程-之并发编程:同步容器

[Java 并发编程实战] 集合框架之 同步容器类 & 并发容器类

转:Java并发编程之八:多线程环境中安全使用集合API(含代码)