摘要: 本小節(jié)是《并發(fā)容器》的最后一部分,這一個(gè)小節(jié)描述的是針對(duì)List/Set接口的一個(gè)線程版本。
在《并發(fā)隊(duì)列與Queue簡(jiǎn)介》中介紹了并發(fā)容器的一個(gè)概括,主要描述的是Queue的實(shí)現(xiàn)。其中特別提到一點(diǎn)LinkedList是List/Queue的實(shí)現(xiàn),但是LinkedList確實(shí)非線程安全的。不管BlockingQueue還是ConcurrentMap的實(shí)現(xiàn),我們發(fā)現(xiàn)都是針對(duì)鏈表的實(shí)現(xiàn),當(dāng)然盡可能的使用CAS或者Lock的特性,同時(shí)都有通過鎖部分容器來提供并發(fā)的特性。而對(duì)于List或者Set而言,增、刪操作其實(shí)都是針對(duì)整個(gè)容器,因此每次操作都不可避免的需要鎖定整個(gè)容器空間,性能肯定會(huì)大打折扣。要實(shí)現(xiàn)一個(gè)線程安全的List/Set,只需要在修改操作的時(shí)候進(jìn)行同步即可,比如使用java.util.Collections.synchronizedList(List
)或者java.util.Collections.synchronizedSet(Set)。當(dāng)然也可以使用Lock來實(shí)現(xiàn)線程安全的List/Set。
通常情況下我們的高并發(fā)都發(fā)生在“多讀少寫”的情況,因此如果 閱讀全文