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

x33g5p2x  于2022-01-13 转载在 Java  
字(1.7k)|赞(0)|评价(0)|浏览(329)

一、集合类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线程安全的源码解析

相关文章