12 同步類容器&併發類容器

1.1 同步類容器

同步類容器都是線程安全的,但是在某些場景下可能需要加鎖來保護複合操作,複合類操作如:迭代(反覆訪問元素,遍歷完容器中所有的元素)、跳轉(根據指定的順序找到當前元素的下一個元素)、以及條件運算。這些複合操作在多線程併發地修改容器時,可能就表現出意外的行爲,最經典的便是ConcurrentModificationException,原因是當容器迭代的過程中,被併發的修改了內容,這是由於早期迭代器設計的時候並沒有考慮併發修改的問題。

 

同步類容器:如古老的VectorHashTable,這些容器的同步功能其實都是由JDKCollection.synchronized***等工廠方法去創建實現的。其底層的機制無非就是傳統的synchronized關鍵字對每個公用的方法都進行同步,使得每次只能有一個線程訪問容器的狀態。這很明顯不滿足我們今天互聯網時代高併發的需求,在保證線程安全的同時,也必須要有足夠好的性能。

 

1.2 併發類容器

JDK5.0以後提供了多種併發類容器來代替同步類容器從而改善性能。同步類容器的狀態都是串行化的。他們雖然實現了線程安全,但是嚴重降低了併發性,在多線程環境時,嚴重降低了應用程序的吞吐量。

併發類容器時專門針對併發設計的,使用ConcurrentHashMap來代替基於散列的傳統的HashTable,而且在ConcurrentHashMap中,添加了一些常見覆合操作的支持。以及使用了CopyOnWriteArrayList代替Voctor,併發的CopyOnWriteArraySett,以及併發的Queue,ConcurrentLinkedQueueLinkedBlockingQueue,前者是該性能的隊列,後者是以阻塞形式的隊列,具體實現的Queue還有很多,例如ArrayBlockingQueuePriorityBlockingQueueSynchronousQueue等。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章