一喧半、并發(fā)list
Vector和CopyOnWriteArrayList是兩個(gè)線程安全的list溪掀,如果在多線程環(huán)境中使用ArrayList則使用Collections.synchronizedList(List list)進(jìn)行包裝臼婆。但兩者實(shí)現(xiàn)的機(jī)制不同:
Vector的get和add/remove等操作都是采用synhronized同步方法峰伙,都需要獲得對(duì)象鎖,并發(fā)時(shí)會(huì)影響性能
代碼塊:
/*get 采用同步方法*/
public synchronized E get(int index) {
if (index >= elementCount)
throw new ArrayIndexOutOfBoundsException(index);
return elementData(index);
}
/*set采用同步方法*/
public synchronized E set(int index, E element) {
if (index >= elementCount)
throw new ArrayIndexOutOfBoundsException(index);
E oldValue = elementData(index);
elementData[index] = element;
return oldValue;
}
CopyOnWriteArrayList利用了對(duì)象的不變性梦抢,讀操作時(shí)沒有加鎖鞍匾,在試圖改變對(duì)象時(shí),總是先獲得對(duì)象的副本骑科,然后對(duì)副本進(jìn)行修改橡淑,最后將副本寫回,寫操作時(shí)用的重入鎖
代碼塊:
/*get方法*/
private E get(Object[] a, int index) {
return (E) a[index];
}
/*set方法采用ReentrantLock鎖*/
public E set(int index, E element) {
final ReentrantLock lock = this.lock;
lock.lock();
try {
Object[] elements = getArray();
E oldValue = get(elements, index);
if (oldValue != element) {
int len = elements.length;
Object[] newElements = Arrays.copyOf(elements, len);
newElements[index] = element;
setArray(newElements);
} else {
// Not quite a no-op; ensures volatile write semantics
setArray(elements);
}
return oldValue;
} finally {
lock.unlock();
}
}
對(duì)比:1.讀操作時(shí)咆爽,CopyOnWriteArrayList更快 2.寫操作時(shí)梁棠,Vector會(huì)比起快,CopyOnWriteArrayList首先申請(qǐng)了鎖,同時(shí)還要進(jìn)行對(duì)象副本復(fù)制
二斗埂、并發(fā)set
與list類似符糊,set也有一個(gè)CopyOnWriteArraySet,實(shí)現(xiàn)set接口呛凶,也是線程安全的男娄。適合讀多寫少的高并發(fā)場(chǎng)景,高并發(fā)寫場(chǎng)景使用Collections 的方法:
public static <T> Set<T> synchronizedSet(Set<T> s) 得到一個(gè)線程安全的set
三漾稀、并發(fā)map
多線程環(huán)境一般使用Collections.synchronizedMap()得到一個(gè)線程安全的map,但在高并發(fā)情況模闲,使用java.concurrent包中的ConcurrentMap的子類ConcurrentHashMap,其get方法是無(wú)鎖的崭捍,put等操作采用分段鎖機(jī)制尸折,從而提高其操作性能,而hashMap則是非線程安全的
四殷蛇、并發(fā)queue
兩種:BlockingQueue(以此為接口的阻塞隊(duì)列)和ConcurrentLinkedQueue(高性能隊(duì)列)实夹,但都繼承自queue。
高并發(fā)場(chǎng)景下使用ConcurrentLinkedQueue隊(duì)列粒梦,而BlockingQueue用于簡(jiǎn)化線程間的數(shù)據(jù)共享
五亮航、并發(fā)deque
并發(fā)雙堆隊(duì)列