同步容器與併發容器

2021-09-02 04:09:10 字數 1136 閱讀 9550

同步容器:可以簡單地理解為通過synchronized來實現同步的容器,如果有多個執行緒呼叫同步容器的方法,它們將會序列執行。比如vector,hashtable(早起jdk的一部分)及collections.synchronized***等方法返回的容器。

可以通過檢視vector,hashtable等這些同步容器的實現**,可以看到這些容器實現執行緒安全的方式就是將它們的狀態封裝起來,並在需要同步的方法上加上關鍵字synchronized。但在某些情況下,我們需要實現額外的復合操作,比如獲取最後乙個元素或者刪除最後乙個元素:

public static object getlast(vector list)   

public static void deletelast(vector list)

雖然上面的方法看起來沒有問題,vector自身的方法也是同步的,但是在多執行緒環境中還是隱藏著問題。如果有兩個執行緒a,b同時呼叫上面的兩個方法,假設list的大小為10,這裡計算得到的lastindex為9,執行緒b首先執行了刪除操作(多執行緒之間操作執行的不確定性導致),而後執行緒a呼叫了list.get方法,這時就會發生陣列越界異常。導致問題的原因就是上面的復合操作不是原子操作,這裡可以通過在方法內部使用list物件鎖來實現原子操作。

同步容器會導致多個執行緒中對容器方法呼叫的序列執行,降低併發性,因為它們都是以容器自身物件為鎖,所以在需要支援併發的環境中,可以考慮使用併發容器來替代。

併發容器:併發容器是針對多個執行緒併發訪問設計的,在jdk5.0引入了concurrent包,其中提供了很多併發容器,如concurrenthashmap,copyonwritearraylist等。

併發容器使用了與同步容器完全不同的加鎖策略來提供更高的併發性和伸縮性,例如在concurrenthashmap中採用了一種粒度更細的加鎖機制,可以稱為分段鎖,在這種鎖機制下,允許任意數量的讀執行緒併發地訪問map,並且執行讀操作的執行緒和寫操作的執行緒也可以併發的訪問map,同時允許一定數量的寫操作執行緒併發地修改map,所以它可以在併發環境下實現更高的吞吐量。

另外併發容器提供了一些在使用同步容器時需要自己實現的復合操作,包括putifabsent等,但是由於併發容器不能通過加鎖來獨佔訪問,所以我們無法通過加鎖來實現復合操作了。

參考:

同步容器與併發容器

同步容器 可以簡單地理解為通過synchronized來實現同步的容器,如果有多個執行緒呼叫同步容器的方法,它們將會序列執行。比如vector,hashtable 早起jdk的一部分 及collections.synchronized 等方法返回的容器。可以通過檢視vector,hashtable等...

同步容器和併發容器

同步容器和併發容器 vector 執行緒安全,在方法上加synchronized arraylist collections 工具類 hashtable 執行緒安全,在方法上加synchronized hashmap 併發容器 copyonwritearraylist 當寫的時候,就複製。缺點 1 ...

科普 同步容器以及併發容器

經典的同步容器有hashmap以及vector,底層的實現機制無非就是使用synchronized關鍵字對每乙個方法進行修飾,保證容器操作的同步,但是效能很低,無法滿足現如今網際網路時代的高併發要求。jdk5.0以後便開始使用併發類容器來替代同步類容器,原因是同步容器雖然實現了執行緒安全,但是基本上...