public class CopyOnWriteArrayList {
private transient volatile Object[] array;
public boolean add(E e) {
// 貌似定义一个本地变量指向属性,对性能会有优化?
// https://stackoverflow.com/questions/3866537/why-j-u-c-copyonwritearraylist-creates-local-lock-variable-inside-methods
final ReentrantLock lock = this.lock;
// 只有写写操作才要加锁互斥
lock.lock();
try {
Object[] elements = getArray();
int len = elements.length;
// 修改时先复制一份数组快照,带上预计的容量
// 复制快照的成本昂贵
Object[] newElements = Arrays.copyOf(elements, len + 1);
newElements[len] = e;
// 修改完快照后,再让内部指针指向新数组
setArray(newElements);
return true;
} finally {
lock.unlock();
}
}
public boolean addIfAbsent(E e)
Object[] snapshot = getArray();
// 调用了indexOf检查元素的存在,实质上是遍历,性能不好
return indexOf(e, snapshot, 0, snapshot.length) >= 0 ? false :
addIfAbsent(e, snapshot);
}
// indexOf使用了遍历,性能不好
private static int indexOf(Object o, Object[] elements,
int index, int fence) {
if (o == null) {
for (int i = index; i < fence; i++)
if (elements[i] == null)
return i;
} else {
for (int i = index; i < fence; i++)
if (o.equals(elements[i]))
return i;
}
return -1;
}
}
CopyOnWriteArrayList小抄
最后编辑于 :
©著作权归作者所有,转载或内容合作请联系作者
- 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
- 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
- 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
推荐阅读更多精彩内容
- vue.js推荐使用的扩展名为vue的组件模板,可以让标签的属性和内容都变得动态,这是很强大也很已用的能力。但是,...