ArrayList源码分析(一)

2019-12-09  本文已影响0人  wervy

我们先来看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<>())

上一篇下一篇

猜你喜欢

热点阅读