并发中的List集合

本文探讨了并发环境中ArrayList、Vector和Collections.synchronizedList的线程安全性问题。ArrayList是非线程安全的,Vector虽然线程安全,但在复合操作中仍需额外加锁。Collections.synchronizedList创建的线程安全List在复合操作时同样需要手动同步。CopyOnWriteArrayList适用于读多写少的并发场景,但不保证读写并发的安全。
摘要由CSDN通过智能技术生成

本文作者:王一飞,叩丁狼高级讲师。原创文章,转载请注明出处。  

实际开发中, 我们使用频率最高的容器估计是list集合,那肯定会遇并发操作.那该如何保证在多线程并发的环境下安全,高效的使用list集合呢?好,这就是今天我们聊话题:并发中的List集合.

家族体系

List: 有序集合(也称为序列 )。用户可以精确控制列表中每个元素的插入位置。 也可以通过整数索引(列表中的位置)访问元素,并搜索列表中的元素。 常用方法有:
添加: boolean add(E e);
删除: boolean remove(Object o);
修改: E set(int index, E element);
查询: E get(int index);
下面是List接口的实现体系:
List家族体系
常见的实现类:
ArrayList : 可调整大小的数组的实现List接口
LinkedList :实现List和Deque接口的双链表
Vector: 实现了可扩展的对象数组,是同步的ArrayList
CopyOnWriteArrayList:带有快照功能的读写安全并发容器类
Stack:最先进先出(LIFO)堆栈的对象

具体分析

List集合实现类众多,本篇挑出具有代表选3个实现类来逐一分析, 在并发环境下,它们的使用注意.

ArrayList

ArrayList 类其下所有操作方法都没有使用任何加锁痕迹,这表明该类是一个线程不安全类.比如下面添加的方法:

  public boolean add(E e) {
        ensureCapacityInternal(size + 1);  
        elementData[size++] = e;
        return true;
    }
    private void ensureCapacityInternal(int minCapacity) {
        if (elementData == DEFAULTCAPACITY_EMPTY_ELEMENTDATA) {
            minCapacity = Math.max(DEFAULT_CAPACITY, minCapacity);
        }

        ensureExplicitCapacity(minCapacity);
    }

在多线程环境下, 如果使用ArrayList进行操作时,可能存在线程不安全的隐患, 比如下面的例子:
需求:事先准备好一个集合list, 一个线程删除最后一个元素, 一个线程清空list集合

public class App {
    public static void main(String[] args) {
        ArrayList<String> list = new ArrayList<>();
        list.add("1");
        list.add("2");
        new Thread(new Runnable() {
            public void run() {
                //集合大小
                int len = list.size();
                try {
                    //睡5s
                    Thread.sleep(
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值