作为一名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这样的异常。