索引
链接
https://zhuanlan.zhihu.com/p/48784500
文章截图
简评
首先,这个文章标题有些夸张,博眼球。
然后,CopyOnWriteArrayList我确实早已经将他遗忘了,应该是3年前毕业应聘时看过这个类,后来工作后高并发情况用的很少,就生疏了。
最后说说这个类,概括总结这个类,它对读不加锁,对写加锁,并且写操作是copy出一个新数组,在新数组上进行写操作,不影响其他已经拿到旧版数组的线程。所以缺点就很明显啦,一个线程修改了数组内容后,其他在写操作之前读了数组内容的线程并不能看到新的修改。但是要说一点,这个类里面实际存储对象的数组使用tranisent和volatile进行了标记,我这里记录一下为什么。先看下我说的代码,如下:
/** The array, accessed only via getArray/setArray. */ private transient volatile Object[] array;
首先看注释,说的很明白:这个数组只能通过getArray和setArray来访问。
所以,序列化时,也必须通过get和set来访问,怎么实现呢?就是把数组标记为transient,代表不希望被序列化,然后写供序列化使用的readObject和writeObject方法。在这两个方法内通过get和set访问数组就避免序列化时发生并发问题啦。
然后volatile,因为是高并发场景,所以是为了可见性。让一个线程的修改被其他线程及时看到。
原创文章,作者:geekgao,如若转载,请注明出处:https://www.geekgao.cn/archives/1494