当前位置: 首页 > news >正文

【面试题】集合并发问题

正文

  • ArrayList是否线程安全
  • 为什么线程不安全
  • 如何解决线程不安全问题
    • 1. Vector
    • 2. Collections.synchronizedList
    • 3. CopyOnWriteArrayList
  • set和map线程不安全解决

ArrayList是否线程安全

答案是肯定的,线程不安全。

public class TestArrayList {
    public static void main(String[] args) {

        List<String> list = new ArrayList<>();
        
        for (int i = 0; i < 30; i++) {
            new Thread(()->{
                list.add(UUID.randomUUID().toString());
                System.out.println(list);
            }).start();
        }
    }
}

运行以上代码,抛出异常java.util.ConcurrentModificationException

为什么线程不安全

在这里插入图片描述
看底层代码可以看出,在调用add方法的时候并没有加锁,所以线程不安全。

如何解决线程不安全问题

1. Vector

 List<String> list = new Vector<>(); //Vector是通过加入锁来实现线程安全的

在这里插入图片描述

2. Collections.synchronizedList

 List<String> list = Collections.synchronizedList(new ArrayList<>());

3. CopyOnWriteArrayList

  List<String> list =new CopyOnWriteArrayList<>();

在这里插入图片描述
写时复制
CopyOnWriteArrayList是一个写时复制的容器,在往容器中添加元素的时候,不是直接往当前容器elements添加,而是将当前容器进行拷贝,复制出来一个新的容器newElements,数据添加完成后,将原容器的引用指向新的容器setArray(newElements)
这样做的好处是可以进行并发读,而不用加锁,因为当前容器不会添加任何元素,所以CopyOnWrite是一种读写分离的思想,读和写不是同一个容器。

set和map线程不安全解决

CopyOnWriteArraySet<String> list =new CopyOnWriteArraySet<String>();
Map<String,String> list =new ConcurrentHashMap<>();

相关文章:

  • 精品基于Uniapp+SSM实现的Android安全网购平台
  • Spring Cloud Gateway 网关实现白名单功能
  • Android Studio Chipmunk | 2021.2.1 Patch 2(2022 年 8 月)
  • 小程序商城上线需要做什么?
  • 选择边缘计算网关的五大优势
  • “蔚来杯“2022牛客暑期多校训练营4(A,D,H,K,N)
  • 达梦DataWatch主备环境搭建
  • python入门I--基本概念--基本语法--变量和标识符--数据类型
  • opencv-python之图像的加法与按位运算
  • rocketMq 安装
  • 明日风尚杂志明日风尚杂志社《明日风尚》杂志社2022年第10期目录
  • django之day01
  • Linux中bind9的view(视图解析)配置示例与注意事项
  • BEIT-3杂谈
  • Nuxt.js - 根据条件,动态控制页面是否缓存(keep-alive-props)
  • Go 语言编译器的 //go: 详解
  • Java教程_软件开发基础
  • java小心机(3)| 浅析finalize()
  • MySQL的数据类型
  • Next.js之基础概念(二)
  • sessionStorage和localStorage
  • springboot_database项目介绍
  • SQL 难点解决:记录的引用
  • VUE es6技巧写法(持续更新中~~~)
  • vue从创建到完整的饿了么(11)组件的使用(svg图标及watch的简单使用)
  • 持续集成与持续部署宝典Part 2:创建持续集成流水线
  • 解决iview多表头动态更改列元素发生的错误
  • 猫头鹰的深夜翻译:JDK9 NotNullOrElse方法
  • 用 Swift 编写面向协议的视图
  • scrapy中间件源码分析及常用中间件大全
  • # Apache SeaTunnel 究竟是什么?
  • # 执行时间 统计mysql_一文说尽 MySQL 优化原理
  • (ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY)讲解
  • (层次遍历)104. 二叉树的最大深度
  • (附源码)spring boot校园拼车微信小程序 毕业设计 091617
  • (论文阅读22/100)Learning a Deep Compact Image Representation for Visual Tracking
  • (四)linux文件内容查看
  • (一)基于IDEA的JAVA基础10
  • (转)自己动手搭建Nginx+memcache+xdebug+php运行环境绿色版 For windows版
  • (最全解法)输入一个整数,输出该数二进制表示中1的个数。
  • .CSS-hover 的解释
  • .net core 连接数据库,通过数据库生成Modell
  • .Net IE10 _doPostBack 未定义
  • .net redis定时_一场由fork引发的超时,让我们重新探讨了Redis的抖动问题
  • .net项目IIS、VS 附加进程调试
  • .Net中ListT 泛型转成DataTable、DataSet
  • [100天算法】-目标和(day 79)
  • [2669]2-2 Time类的定义
  • [android]-如何在向服务器发送request时附加已保存的cookie数据
  • [BetterExplained]书写是为了更好的思考(转载)
  • [C puzzle book] types
  • [C和指针].(美)Kenneth.A.Reek(ED2000.COM)pdf
  • [delphi]保证程序只运行一个实例
  • [Head First设计模式]策略模式
  • [leetcode] 61. 旋转链表