您当前的位置: 首页 >  Java

小志的博客

暂无认证

  • 1浏览

    0关注

    1217博文

    0收益

  • 0浏览

    0点赞

    0打赏

    0留言

私信
关注
热门博文

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

小志的博客 发布时间:2022-01-11 23:01:19 ,浏览量:1

目录
    • 一、集合类HashMap线程不安全的代码示例
    • 二、集合类HashMap线程不安全的故障现象
    • 三、集合类HashMap线程不安全的原因
    • 四、集合类HashMap线程不安全的解决方案
      • 4.1、解决方式一:通过Collections工具类解决
      • 4.2、解决方式二:通过JUC包下的并发集合类解决
    • 五、ConcurrentHashMap线程安全的源码解析

一、集合类HashMap线程不安全的代码示例
  • 代码

    import java.util.*;
    /**
     * @description: HashMap线程不安全的代码示例
     * @author: xz
     */
    public class ContainerNotSafe {
        public static void main(String[] args) {
            Map map=new HashMap();
            //模拟30个线程,往HashMap集合中添加数据
            for(int i=1;i{
                    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 map=Collections.synchronizedMap(new HashMap());
            //模拟30个线程,往synchronizedMap集合中添加数据
            for(int i=1;i{
                    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 map=new ConcurrentHashMap();
            //模拟30个线程,往synchronizedMap集合中添加数据
            for(int i=1;i{
                    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
关注
打赏
1661269038
查看更多评论
立即登录/注册

微信扫码登录

0.0516s