Java中的COW
“COW”全称Copy-On-Write,是一种用于程序设计中的优化策略。其基本思路是,多线程读的时候共享一个数据结构,但是在写的时候,单独拷贝一个新的数据结构出来,在这个新的数据结构上添加数据,而后,将引用指向这个新的数据结构。Java提供了两个COW数据结构,分别是CopyOnWriteArrayList和CopyOnWriteArraySet。
CopyOnWriteArrayList
添加元素
根据CopyOnWriteArrayList的特性,看下它的add方法。
1 | /** |
添加元素主要分几个步骤:
- 首先加锁,如果不加锁的话,并发添加的时候,会多产生N多个数组副本
- 拷贝一份新数组
- 将新元素添加到新数组的末尾
- 将原数组的引用指向新数组
在指定位置添加元素也一样
1 | /** |
查找元素
不加锁,直接读
1 | @SuppressWarnings("unchecked") |
CopyOnWriteArraySet
添加元素
CopyOnWriteArraySet底层实现和CopyOnWriteArrayList是一致的,区别就在于添加元素的时候,它判断了元素是不是已经在数组中了,已经在的话,直接返回false,否则添加新元素。
1 | /** |
addIfAbsent
如果当前元素在数组的下标不为-1,返回false,不添加,否则添加新元素
1 | /** |
addIfAbsent(E, Object[])
1 | /** |