java多線程中並發集合和同步集合有哪些?
hashmap 是非同步的,故在多線程中是線程不安全的,不過也可以使用 同步類來進行包裝:
包裝類Collections.synchronizedMap()和Collections.synchronizedList()提供了一個基本的有條件的線程安全的Map和List實現。
ConcurrentHashMap和Hashtable之間的區別
那么Hashtable和ConcurrentHashMap之間的區別是什么,可以在多線程環境中使用,但一旦Hashtable的大小變得相當大的性能降低,因為迭代它必須被鎖定更長的時間。由於ConcurrentHashMap引入了分段的概念,所以它只有一部分被鎖定才能提供線程安全性.
總而言之,ConcurrentHashMap僅鎖定Map的某些部分,而Hashtable在執行迭代時鎖定完整映射。
ConcurrentHashMap和Collections.synchronizedMap之間的區別
ConcurrentHashMap旨在實現並發性能,提高性能,而通過使用synchronized Map應用包裝器,可以同步自然不同步的HashMap。Synchronized vs Concurrent Collections
不管是同步集合還是並發集合他們都支持線程安全,他們之間主要的區別體現在性能和可擴展性,還有他們如何實現的線程安全。同步HashMap, Hashtable, HashSet, Vector, ArrayList 相比他們並發的實現(比如:ConcurrentHashMap, CopyOnWriteArrayList, CopyOnWriteHashSet)會慢得多。造成如此慢的主要原因是鎖, 同步集合會把整個Map或List鎖起來,而並發集合不會。並發集合實現線程安全是通過使用先進的和成熟的技術像鎖剝離。比如ConcurrentHashMap 會把整個Map 划分成幾個片段,只對相關的幾個片段上鎖,同時允許多線程訪問其他未上鎖的片段。
同樣的,CopyOnWriteArrayList 允許多個線程以非同步的方式讀,當有線程寫的時候它會將整個List復制一個副本給它。
如果在讀多寫少這種對並發集合有利的條件下使用並發集合,這會比使用同步集合更具有可伸縮性。
順便說一下,集合類是Java API的核心,所以我覺得明智而審慎地使用它們是一門藝術。這是我的個人經驗,我通過使用ArrayList替換遺留代碼里使用的Vector來提高性能。JDK 1.5引入一些很好的並發集合能高效地開發高容量,低延遲的Java應用程序。
Synchronized Collections vs Concurrent Collections in Java
同步集合類,Hashtable 和 Vector 還有同步集合包裝類,Collections.synchronizedMap()和Collections.synchronizedList() 提供了一個基本的有條件的線程安全的Map和List的實現。
所以Hashtable和ConcurrentHashMap的區別是什么,他們都可以在多線程環境中使用,但一旦Hashtable 的大小變得相當大的時候,其性能會降低,因為迭代的時候會被長時間鎖定。
然而有一些因素導致他們不適合在高並發應用程序中使用,最主要的原因是在他們的‘集合范圍’的鎖是程序可伸縮性的一個阻礙。它往往成為必須在相當長一段時間內對集合加鎖以防止在迭代期間出現ConcurrentModificationException。
ConcurrentHashMap和CopyOnWriteArrayList不一定在所有地方都是有用的,一般情況下你只需要使用HashMap或ArrayList。
因為ConcurrentHashMap 引入了分片的概念,所以無論集合有多大,她都只對特定的片段進行加鎖以保障線程安全,其他的讀線程仍然可以訪問map而不用等待正在訪問的線程遍歷結束。
java.util.concurrent包中包含的並發集合類如下:
ConcurrentHashMap
CopyOnWriteArrayList
CopyOnWriteArraySet