面试官:你都工作3年了,怎么连ArrayList是否为线程不安全都没有搞清楚

本文讨论了ArrayList在多线程环境中的线程不安全性,并通过源码分析解释了为何会出现`ConcurrentModificationException`。文章指出,ArrayList效率虽高,但非线程安全,适合单线程使用。为了解决线程不安全问题,文章提出了CopyOnWriteArrayList和Vector等解决方案,并详细解释了CopyOnWriteArrayList的写时复制机制。最后,提到了使用synchronized同步锁作为另一种解决策略。
摘要由CSDN通过智能技术生成

作为一名java程序员,对ArrayList,相信再熟悉不过了。这个类我们平时接触得最多的一个列表集合类。

面试时,也有不少面试官会针对此知识点考察求职者。

 

小爱最近又去面试了,面试官刚好问到这个。

小爱最近又去面试了,最近到某知名互联网公司面试,做了笔试题后,面试官刚好问ArrayList是线程安全还是非线程安全?

小爱说是非线程安全,面试官问,你能说说为什么是非线程安全吗?

小爱一时间说不出个所以然。

面试官说:你都工作3年了,怎么连ArrayList是否为线程不安全都没有搞清楚

小爱感觉这次面试要黄了,类似这样的问题平时应该要掌握好才对。

01、线程安全和线程不安全

   

首先,我们来弄清楚两个概念,

什么是线程安全、什么是线程不安全

线程安全:指当多线程访问时,采用了加锁的机制;即当一个线程访问该类的某个数据时,会对这个数据进行保护,其他线程不能对其访问,直到该线程读取完之后,其他线程才可以使用。防止出现数据不一致或者数据被污染等意外情况。

 

线程不安全:就是不提供数据访问时的数据保护,多个线程能够同时操作某个数据,从而出现数据不一致或者数据污染等意外情况。

 

 

02、为什么ArrayList是线程不安全?

   

 

我们在多线程情况下用   List<String> list = new ArrayList<>();

在add(param)添加信息经常会遇到ConcurrentModificationException这样的异常。

 

我们写个例子来验证下。

public static void main(String[] args){
   List<String> list = new ArrayList<>();
    for (int i = 0; i < 20; i++) {
        new Thread(()->{
                list.add(UUID.randomUUID().toString().substring(0, 6));
                System.out.print(list);
                System.out.print("\n");
        },String.valueOf(i)).start();
    }
}

 

咋一看,程序没什么问题,运行有时候也是正常的,但运行几次就会抛出ConcurrentModificationException这样的异常。

 

  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值