CopyOnWriteArrayLis的一个小疑问

来源:5-8 并发容器及安全共享策略总结

朱小悬

2019-01-14

老师好!
CopyOnWriteArrayList读操作时为什么还要再进行一次getArray(),直接return array[index]不好吗?
http://img.mukewang.com/szimg/5c3c4573000154ac15000309.jpg
http://img.mukewang.com/szimg/5c3c45720001957204280134.jpg

写回答

1回答

Jimin

2019-01-14

你好,能注意到这里的细节,给你点赞!

get()方法直接调用内部的getArray()方法,而getArray()方法则直接返回成员变量array。这里 array指向一个数组,是CopyOnWriteArrayList的内部数据结构:private transient volatile Object[] array;

这样设计的重点在于:
array是一个volatile变量,其读、写操作具有Happends-Before关系。具体来讲,线程W1通过set()方法“修改”集合后,线程R1能立刻通过get()方法得到array的最新值。

0
1
朱小悬
老师,您好! 我认认真真地看完您的每一个字,还是不明白 return get(getArray(),index)和 return array[index]两者的区别。 array是被volatile修饰的,那 return array[index]会和 return get(getArray(),index)哪里不同了
2019-01-15
共1条回复

Java高并发编程,构建并发知识体系,提升面试成功率

构建完整并发与高并发知识体系,倍增高薪面试成功率!

3923 学习 · 832 问题

查看课程