ArrayList线程不安全以及解决方案

本文通过实例展示了ArrayList在多线程环境下的线程不安全问题,并提供了三种解决方案:使用Vector、Collections.synchronizedList和CopyOnWriteArrayList,推荐使用后两种方法。
摘要由CSDN通过智能技术生成

ArrayList:ArrayList底层为一个Object类型的数组,初始大小为10,在多线程操作ArrayList时会产生各种各样的线程不安全问题,该文章首先还原问题,用三种方法解决该问题。

  • 问题还原
public class ArrayListExample {
    public static void main(String[] args) {
        List list = new ArrayList();
        //List list = Collections.synchronizedList(new ArrayList<>());
        for(int i = 1 ;i<=30;i++){
            new Thread(() ->{
                list.add(UUID.randomUUID().toString().substring(0,8));
                System.out.println(list);
            },String.valueOf(i)).start();
        }
    }
}

可以看到使用ArrayList所导致的问题如上所示

  • 问题解决

1.使用Vector代替,但是Vector在java中的出现比ArrayList出现的还要早,导致性能下降,一般不使用这种方式

2.使用Collections.synchronizedList(new ArrayList<>())解决该问题,解决方式如下

public class ArrayListExample {
    public static void main(String[] args) {
        //List list = new ArrayList();
        List list = Collections.synchronizedList(new ArrayList<>());
        for(int i = 1 ;i<=30;i++){
            new Thread(() ->{
                list.add(UUID.randomUUID().toString().substring(0,8));
                System.out.println(list);
            },String.valueOf(i)).start();
        }
    }
}

3.使用CopyOnWriteArrayList,读写分离,写入时复制

public class ArrayListExample {
    public static void main(String[] args) {
        List list = new CopyOnWriteArrayList();
        //List list = Collections.synchronizedList(new ArrayList<>());
        for(int i = 1 ;i<=30;i++){
            new Thread(() ->{
                list.add(UUID.randomUUID().toString().substring(0,8));
                System.out.println(list);
            },String.valueOf(i)).start();
        }
    }
}

以上三种方式问题都可以解决,推荐第二种或者第三种。

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值