在 Java 中ArrayList 不是线程安全的,下面我重点谈谈ArrayList不是线程安全的原因及解决方案。
ArrayList为什么线程不安全
ArrayList 在多线程环境下不安全的原因主要有两个:
1.非线程安全的修改操作
ArrayList 底层使用一个数组来存储元素,而数组的长度是固定的。
如果多个线程同时对 ArrayList
进行添加或删除元素的操作,那么它们可能会同时修改数组,从而导致数据不一致或其它错误。
2.不可见性问题
除了竞态条件之外,还有可能出现不可见性问题。
在多线程环境下,每个线程都有自己的工作内存,这些工作内存可能不会及时地与主内存进行同步。
如果一个线程修改了 ArrayList 中的某个元素,而另一个线程没有及时地看到这个修改,就会导致数据不一致。
ArrayList线程不安全解决方案
如果需要在多线程环境下使用列表,并且需要保证线程安全,可以考虑使用线程安全的列表实现,例如 :Vector、 或 CopyOnWriteArrayList。
Vector 是一个早期的 Java 类,它的所有公共方法都是同步的,因此可以保证线程安全。
CopyOnWriteArrayList 是一个基于数组的列表实现,它使用一种称为“写时复制”(copy-on-write)的技术来保证线程安全。
每当进行修改操作时,CopyOnWriteArrayList 都会先复制整个数组,然后再进行修改操作,因此能够避免多个线程同时修改同一个数组的问题。
陈睿mikechen
10年+大厂架构经验,资深技术专家,就职于阿里巴巴、淘宝、百度等一线互联网大厂。
关注「mikechen」公众号,获取更多技术干货!
后台回复【面试】即可获取《史上最全阿里Java面试题总结》,后台回复【架构】,即可获取《阿里架构师进阶专题全部合集》