1、Vector
這個是最常聽到的線程安全的List實現(xiàn),但是已經(jīng)不常用了。
內(nèi)部實現(xiàn)直接使用synchronized 關(guān)鍵字對 一些操作的方法加鎖。性能很慢。
2、SynchronizedList
使用Collections.synchronizedList(list); 將list包裝成SynchronizedList
需要注意的是SynchronizedList的add等操作加了鎖,但是iterator()方法沒有加鎖,如果使用迭代器遍歷的時候需要在外面手動加鎖。
適用場景:當(dāng)不需要使用iterator()并且對性能要求不高的場景。
SynchronizedList 和 Vector區(qū)別
1> SynchronizedList 有較好的擴展性,可以將ArrayList ,LinkedList等都改成同步的,而Vector底層只有數(shù)組的結(jié)構(gòu)。
2> SynchronizedList 并沒有對Iterator方法進行加鎖,遍歷時需要手動同步處理,Vector加鎖了。
3> SynchronizedList 可以指定鎖定的對象。
4> 擴容機制不一樣SynchronizedList 1.5倍 ,Vector 2倍。
5、SynchronizedList使用同步代碼塊,鎖的范圍更小。Vector鎖的方法。
3、CopyOnWriteArrayList
在寫的時候加鎖(ReentrantLock鎖),讀的時候不加鎖,大大提升了讀的速度。
添加元素的時候,先加鎖,再復(fù)制替換操作,再釋放鎖。
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();
}
}
適用場景:適用于讀多寫少的場景。
CopyOnWriteArraySet 這個集合也是在add時加鎖,不過在增加元素前會先判斷元素是否存在,不存在才會調(diào)add方法。