多线程下ArrayList问题

192 阅读1分钟

1.最近做项目中发现,有一串代码在多线程下 往ArrayList下 add()数据:

image.png

image.png

乍一看没什么问题,直到运行起来后发现: 为了演示写了个Demo:

image.png

结果: image.png

抛出 : java.lang.ArrayIndexOutOfBoundsException

多线程下使用哪个List呢?

Vector

Vector是线程安全的,这个类属性和方法同ArrayList,主要区别是Vector在其主要方法上都加上了synchronized关键字,这样就达到了线程安全的目的。

copyOnWriteArrayList

在CopyOnWriteArrayList中,只有增删改操作添加了锁,查询则没有,使多线程能并行访问。

需要注意的是:CopyOnWriteArrayList 并没有ArrayList的自动扩容(1.5倍),添加了一次执行Arrays.copyOf操作,这个会成为性能瓶颈

因此: 在读多写少的情况下, 使用CopyOnWriteArrayList 写多读少的情况依然推荐使用 Vector