ArrayList线程安全吗?附原因及解决方案

ArrayList线程安全吗?附原因及解决方案-mikechen

在 Java 中ArrayList 不是线程安全的,下面我重点谈谈ArrayList不是线程安全的原因及解决方案。

ArrayList为什么线程不安全

ArrayList 在多线程环境下不安全的原因主要有两个:

1.非线程安全的修改操作

ArrayList 底层使用一个数组来存储元素,而数组的长度是固定的。

如果多个线程同时对 ArrayList 进行添加或删除元素的操作,那么它们可能会同时修改数组,从而导致数据不一致或其它错误。

 

2.不可见性问题

除了竞态条件之外,还有可能出现不可见性问题。

在多线程环境下,每个线程都有自己的工作内存,这些工作内存可能不会及时地与主内存进行同步。

如果一个线程修改了 ArrayList 中的某个元素,而另一个线程没有及时地看到这个修改,就会导致数据不一致。

 

ArrayList线程不安全解决方案

如果需要在多线程环境下使用列表,并且需要保证线程安全,可以考虑使用线程安全的列表实现,例如 :Vector、 或 CopyOnWriteArrayList。

Vector 是一个早期的 Java 类,它的所有公共方法都是同步的,因此可以保证线程安全。

CopyOnWriteArrayList 是一个基于数组的列表实现,它使用一种称为“写时复制”(copy-on-write)的技术来保证线程安全。

每当进行修改操作时,CopyOnWriteArrayList 都会先复制整个数组,然后再进行修改操作,因此能够避免多个线程同时修改同一个数组的问题。

陈睿mikechen

10年+大厂架构经验,资深技术专家,就职于阿里巴巴、淘宝、百度等一线互联网大厂。

关注「mikechen」公众号,获取更多技术干货!

后台回复面试即可获取《史上最全阿里Java面试题总结》,后台回复架构,即可获取《阿里架构师进阶专题全部合集

评论交流
    说说你的看法