前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >多线程笔记(十)集合 的线程安全

多线程笔记(十)集合 的线程安全

作者头像
一写代码就开心
发布2022-05-25 11:00:46
2750
发布2022-05-25 11:00:46
举报
文章被收录于专栏:java和python

目录

1 ArrayList()集合(有线程安全问题)

他是线程不安全的,我们创建这个对象,调用他的add方法往里面加东西,我们看源码,可以看到这个add方法是没有加锁的,所以在多线程往这个集合里面加数据的时候,会出现并发修改异常

就是我们一边线程往list里面加东西,一边取东西,A线程在往list里面放东西,B线程从list里面拿东西,都是同一时间,所以会出现并发问题

代码语言:javascript
复制
 //创建ArrayList集合
 List<String> list = new ArrayList<>();
 for (int i = 0; i <30; i++) {
     new Thread(()->{
         //向集合添加内容
         list.add(UUID.randomUUID().toString().substring(0,8));
         //从集合获取内容
         System.out.println(list);
     },String.valueOf(i)).start();
 }

以上代码会出现并发问题

2 如何解决以上的线程安全的问题

2.1 使用Vector集合(没有线程安全问题)

因为这个类里面的方法上面都有synchronized关键字

在这里插入图片描述
在这里插入图片描述

2.2 使用集合工具类

java的jdk里面有一个工具类,collections ,这个类里面的方法有很多,都是静态方法

我们使用这个里面的一个方法创建线程安全的list的集合对象

在这里插入图片描述
在这里插入图片描述
代码语言:javascript
复制
//        collections工具类
List<String> list = Collections.synchronizedList(new ArrayList<>());

2.3 CopyOnWriteArrayList

多线程笔记(七)JUC 这个包下有很多的类,其中CopyOnWriteArrayList是一个安全的集合类

3 HashSet有线程安全的问题

里面的add方法没有加锁,所以在多个线程对他进行加数据,读数据的时候,就会有线程安全的问题

3.1 解决

代码语言:javascript
复制
CopyOnWriteArraySet list = new CopyOnWriteArraySet();

4 HashMap 有线程安全的问题

里面的put方法没有加锁,所以在多个线程对他进行加数据,读数据的时候,就会有线程安全的问题

4.1 解决

代码语言:javascript
复制
  ConcurrentHashMap oMap = new ConcurrentHashMap();

5 总结

在这里插入图片描述
在这里插入图片描述
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2022-05-24,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 目录
  • 1 ArrayList()集合(有线程安全问题)
  • 2 如何解决以上的线程安全的问题
    • 2.1 使用Vector集合(没有线程安全问题)
      • 2.2 使用集合工具类
        • 2.3 CopyOnWriteArrayList
        • 3 HashSet有线程安全的问题
          • 3.1 解决
          • 4 HashMap 有线程安全的问题
            • 4.1 解决
            • 5 总结
            领券
            问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档