多執行緒(六) 同步類容器和併發類容器

2021-08-28 07:06:48 字數 950 閱讀 2692

如古老的vector、hashtable。這些容器的同步功能其實都是有jdk的collections.synchronized**等工廠方法去建立的。其底層的機制無非就是用傳統的synchronized關鍵字對每個公用的方法都進行同步,使得每次只能有乙個執行緒訪問容器的狀態。這很明顯不滿足我們今天網際網路時代高併發的需求,在保證執行緒安全的同時,也必須要有足夠好的效能。

concurrentmap介面有兩個重要的實現:

concurrenthashmap

concurrentskiplistmap(支援併發排序功能,彌補concurrenthashmap)對應treemap

concurrenthashmap內部使用段(segment)來表示這些不同的部分,每個其實就是乙個小的hashtable。它們有自己的鎖。只要多個修改操作發生在不同的段上,它們就可以併發進行。把乙個整體分成了16個段(segment)。也就是最高支援16個執行緒的併發修改操作。這也是在多執行緒場景時減小鎖的粒度從而降低鎖競爭的一種方案。並且**中大多共享變數使用volatile關鍵字宣告,目的是第一時間獲取修改的內容,效能非常好。

public class useconmap 

}}

copyonwrite容器即寫時複製的容器。通俗的理解是當我們對乙個容器(新增、修改、刪除)的時候,不直接往當前容器(新增、修改、刪除),而是先將當前容器進行copy,複製出乙個新的容器,然後新的容器裡新增元素,新增完元素之後,再將原容器的引用指向新的容器。這樣做的好處是我們可以對copyonwrite容器進行併發的讀,而不需要加鎖,因為當前容器不會新增任何元素。所以copyonwrite容器也是一種讀寫分離的思想,讀和寫不同的容器。

適合讀多寫少的場景。

如果寫多,那麼就會頻繁的拷貝,消耗效能。寫多,不如直接在**上加鎖。

2.2.1 copyonwritearraylist

2.2.2 copyonwritearrayset

同步類容器和併發類容器

同步類容器都是執行緒安全的,但是某些場景下可能需要加鎖來保護復合操作。復合類操作如 迭代 反覆訪問元素,遍歷完容器中所有的元素 跳轉 根據指定的順序找到當前元素的下乙個元素 以及條件運算。這些復合操作在多執行緒併發地修改容器時,可能會表現出意外的行為,最經典的便是concurrentmodifica...

同步類容器和併發類容器

同步類容器都是執行緒安全的,但在某些場景下可能需要加鎖來保護復合操作。復合類操作。如 迭代 反覆訪問元素,遍歷完容器中所有的元素 跳轉 根據指定的順序找到當前元素的下乙個元素 以及條件運算。這些復合操作在多執行緒併發地修改容器時,可能會表現出意外的行為,最經典的便是concurrentmodific...

同步類容器和併發類容器

同步類容器都是執行緒安全的,同步容器類包括 vector 和 hashtable,二者都是早期 jdk 的一部分,此外還包括在 jdk1.2 當中新增的一些功能相似的類,這些同步的封裝類是由 collections.synchronized 等工廠方法建立的。但在某些場景下可能需要加鎖來保護復合操作...