java arraylist线程安全_ArrayList 线程安全问题及解决方案

当多个线程同时操作ArrayList时,由于其非线程安全性质,可能导致元素丢失、数组下标越界等问题。解决方案包括使用Vector、Collections.synchronizedList包装ArrayList,或采用CopyOnWriteArrayList。本文探讨了ArrayList的线程不安全原因及三种解决策略。
摘要由CSDN通过智能技术生成

前言

在提到多线程的时候我们大都会想到ArrayList 与 HashMap,这两个类型都是非线性安全的!在多个线程同时操作改集合对象时,会出现哪些问题呢?在传统的集合包内的集合类到底为什么线程非安全呢?在新的JUC包类又有什么可以替代呢?

介绍

①为什么ArrayList 是线性不安全的?

②替代措施及解决方案?

ArrayList 我们都知道底层是以数组方式实现的,实现了可变大小的数组,它允许所有元素,包括null。看下面一个例子:开启多个线程操作List集合,向ArrayList中增加元素,同时去除元素。

8f900a89c6347c561fdf2122f13be562.png

961ddebeb323a10fe0623af514929fc1.png

importjava.util.ArrayList;importjava.util.Collections;importjava.util.List;importjava.util.Vector;public classListTest {//ArrayList

protected static ArrayList arrayList = new ArrayList();//解决措施①:使用Vector集合

protected static Vector arrayListSafe1 = new Vector();//解决措施②:我们加上Collections.synchronizedList,它会自动将我们的list方法进行改变,最后返回给我们一个加锁了List

static List arrayListSafe2 = Collections.synchronizedList(new ArrayList());public static voidmain(String[] args) {

Thread[] threads= new Thread[500];for (int i = 0; i < threads.length; i++) {

threads[i]= newArrayListThread();

threads[i].start();

}for (int i = 0; i < threads.length; i++) {try{

threads[i].join();//等待该线程终止

} catch(InterruptedException e) {

e.printStackTrace();

}

}//输出list中的对象元素

for (int i = 0; i < threads.length; i++) {

System.out.println(arrayList.get(i));

}

}

}/*** 线程类,执行arrayList的add()增加方法

*

*@authorzyx

**/

class ArrayListThread extendsThread {

@Overridepublic voidrun() {try{

Thread.sleep(1000);

}catch(InterruptedException e) {

e.printStackTrace();

}//增加元素

ListTest.arrayList.add(Thread.currentThread().getName());

}

}

View Code

运行代码结果可知,会出现以下几种情况:

①Null

②某些线程并未打印

③数组下标越界异常

由此我们可以得出,在多线程情况下操作ArrayList 并不是线性安全的。那如何解决呢?

第一种方案:

使用Vertor集合

8f900a89c6347c561fdf2122f13be562.png

961ddebeb323a10fe0623af514929fc1.png

protected static Vector arrayListSafe1 = new Vector();

View Code

第二种方案:

使用Collections.synchronizedList。它会自动将我们的list方法进行改变,最后返回给我们一个加锁了List

8f900a89c6347c561fdf2122f13be562.png

961ddebeb323a10fe0623af514929fc1.png

protected static List arrayListSafe2 = Collections.synchronizedList(new ArrayList());

View Code

第三种方案:

使用JUC中的CopyOnWriteArrayList类进行替换。具体详情可参考JUC框架

常见集合线性是否安全可参考下图:

List.png

参考文章:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值