ArrayList 是线程安全的么?

1、典型回答

ArrayList 是非线程安全的数据结构

多线程环境下,如果多个线程同时对同一个 ArrayList 进行添加、删除或修改操作,可能会导致数据不一致或发生异常。这是因为,ArrayList 在内部实现时,并没有添加任何线程同步的机制,所以如果有多个线程同时对ArrayList 进行修改时,就会导致线程不安全的问题发生。

2、全面剖析

ArrayList 是非线程安全的容器,它是设计在单线程底下使用的,所以如果同时有多个线程对 ArrayList 进行非查询操作时,就会造成线程安全问题

例如,添加操作和修改操作同时执行,那么它们的执行情况可能是这样的:

  1. 首先,先执行添加操作,而添加时发现 ArrayList 需要进行扩容,所以此时就先执行了扩容操作
  2. 扩容操作执行一半之后,当前线程 CPU 时间片用完了,停止执行
  3. 修改线程开始执行,于是将 ArrayList 已经扩容的这部分旧数据进行修改,修改线程执行完成
  4. 扩容操作继续执行,将后半一半数组进行扩容。
  5. 将原对象的引用更换到新数组上

此时就会发现,修改线程的修改操作失效了,因为修改线程,修改的是老数组,而添加操作在扩容时,已经将旧数据复制到新数组了,所以此时的修改操作就丢失了,这就是线程安全问题。

3、知识扩展

如何让 ArrayList 变成线程安全的?

想要让 ArrayList 变成线程安全的,也就是想要在多线程下使用 ArrayList 的方案有以下两类:

  1. 加锁:在多线程下,对 ArrayList 进行非查询操作时,先加锁,可以使用 synchronized 或 Lock,让线程排队执行,这样对于 ArrayList 的操作就变成单线程了,这样 ArrayList 就是线程安全的了。
  2. 更换同类型线程安全的容器:在多线程下可以将 ArrayList 更换为线程安全的 CopyOnWriteArrayList,这样也不会有线程安全问题

CopyOnWriteArrayList 是如何保证线程安全的? 请参考:

相关推荐

  1. ArrayList 线安全

    2024-03-16 01:38:06       42 阅读
  2. ArrayList线安全情况

    2024-03-16 01:38:06       36 阅读
  3. CopyOnWriteArrayList线安全吗?

    2024-03-16 01:38:06       43 阅读
  4. Spring 中 Bean 线安全

    2024-03-16 01:38:06       57 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-03-16 01:38:06       98 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-03-16 01:38:06       106 阅读
  3. 在Django里面运行非项目文件

    2024-03-16 01:38:06       87 阅读
  4. Python语言-面向对象

    2024-03-16 01:38:06       96 阅读

热门阅读

  1. R在直方图上添加一个更平滑的密度曲线

    2024-03-16 01:38:06       39 阅读
  2. JVM配置调优

    2024-03-16 01:38:06       45 阅读
  3. C语言程序设计(第四版)—习题11程序设计题

    2024-03-16 01:38:06       38 阅读
  4. PID、LQR、MPC三者的原理及区别

    2024-03-16 01:38:06       90 阅读
  5. mybatis转义字符

    2024-03-16 01:38:06       45 阅读
  6. 563: String(python)

    2024-03-16 01:38:06       45 阅读
  7. Solidity Uniswap V2 library contract

    2024-03-16 01:38:06       42 阅读
  8. php中register_shutdown_function 函数用法详解

    2024-03-16 01:38:06       41 阅读
  9. 不学51直接学stm32可以吗?学stm32需要哪些基础?

    2024-03-16 01:38:06       42 阅读
  10. 学习vue3第六张(vue3 中 computed watch watchEffect)

    2024-03-16 01:38:06       33 阅读
  11. C++超详细知识点(五):类的友元函数和友元类

    2024-03-16 01:38:06       42 阅读