Vector vs Hashtable
都是自带锁,现在基本不用。
CopyOnWriteList
写时复制,当我们需要往里加东西的时候,需要把里面的东西复制出来。在很多时候,它写的次数比较少,读的次数比较多。这时就可以考虑CopyOnWriteList。
public E get(int index) {
return get(getArray(), index);
}
使用CopyOnWriteList读的时候是不需要加锁的。
public boolean add(E e) {
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();
}
}
在写的时候先上把锁,拿到原来的数组和长度,在原来数组基础上拷贝。拷贝完后新数组的长度是length+1,相当于原来数组扩展了1。然后把新添加的元素添加到这个新位置上来。
最后把原来的数组引用指向新的数组。
final void setArray(Object[] a) {
array = a;
}
- queue vs list:对线程友好的API offer、peek、poll
- BlockingQueue:put take->阻塞
|