我们先来看ArrayList的文字描述部分,第一句就表明了ArrayList类是实现List接口的动态数组
下面这段文字描述说了ArrayList有个默认的容量,随着元素的增加,容量会自动扩容
jdk1.8的源码,默认容量是10
这段文字说明了,ArrayList不是线程安全的,可以使用 List list = Collections.synchronizedList(new ArrayList(...));这个进行实现,这是线程同步的
为什么用Collections.synchronizedList()就是线程安全的, 我们来看一下Collections.synchronizedList()的源码,
这段代码说如果list是RandomAccess的实例,则返回SynchronizedRandomAccessList的实例,来我们看看ArrayList是否继承了RandomAccess
果然源码中显示ArrayList继承了RandomAccess的实例,那我们再来看看
我们看到subList方法是加了锁,而这个类继承了SynchronizedList,我们看看SynchronizedList的实现方法
我们看到SynchronizedList的add,get,set,remove等方法都加了锁
总结一下:ArrayList不是线程安全的,如果我们要在多线程中使用ArrayList,比如一个线程做增加操作,一个线程做删除操作,我们可以使用 List list = Collections.synchronizedList(new ArrayList(...));
口说无凭,两种想法我们用代码测试下:
线程不安全写法:
返回结果如下: 多次运行的结果不一样线程安全写法:
结果如下:我连续跑了多次,返回的记过都是33和44
总上:如果在多线程操作同一个ArrayList对象,线程安全的做法是Collections.synchronizedList(new ArrayList<>())
网友评论