ArrayList为什么线程不安全 线程不安全体现在哪些方面 源码角度分析其具体原因

本文探讨ArrayList在多线程环境中的线程安全性问题,通过源码解析和测试用例展示并发操作可能导致的数组越界、值覆盖等现象。分析了size异常、null值插入等情况,并强调了程序员应尽量避免这类潜在风险。
摘要由CSDN通过智能技术生成

前言

我们都知道ArrayList是线程不安全的,那么它不安全在哪里?又会出现什么并发问题呢?

ArrayList继承树

ArrayList继承树


提示:以下是本篇文章正文内容。

一、ArrayList源码摘录

public class ArrayList<E> extends AbstractList<E>
        implements List<E>, RandomAccess, Cloneable, java.io.Serializable
{
   
    /**
     * 列表元素集合数组
     * 说明ArrayList基于数组存储数据
     */
    transient Object[] elementData; 

    /**
     * 列表大小,elementData中存储的元素个数
     */
    private int size;
}

add() 方法

/**
 * Appends the specified element to the end of this list.
 * 将指定的元素追加到列表的末尾。
 * add() 方法做了如下操作:
 *     1.检查容量是否足够,如不够将进行扩容,并自增 modCount
 *     2.将指定的元素追加到列表的末尾
 *
 * @param e element to be appended to this list
 * @return <tt>true</tt> (as specified by {@link Collection#add})
 */
public boolean add(E e) {
   
    //确保容量足够,如果不够进行扩容
    ensureCapacityInternal(size + 1);  // Increments modCount!!
    //将e存在index为size的位置(即最后一位的下一位置),size++
    //我们都知道,++操作不是原子指令,多线程情况下将发生并发问题
    elementData[size++] = e;
    return true;
}

二、测试用例

@Test
public void listThreadUnsafe() throws InterruptedException {
   <
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

大树91

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值