首先hashMap和hashTable的简单比较
①Java5.0在Java.util.concurrent包中提供了多种并发容器类来改进同步容器的性能。
②ConcurrentHashMap同步容器时Java5增加的一个线程安全的哈希表。对与多线程的操作,介于HashMap和HashTable之间。内部采用“锁分段”机制替代Hashtable的独占锁,进而提高性能
③此包还提供了设计用于多线程上下文的Collection实现:ConcurrentHashMap、ConcurrentSkipListMap、ConcurrentSkipListSet、CopyOnWriteArrayList和CopyOnWriteArraySet。当期望许多线程访问一个给定的collection时,ConcurrentHashMap通常优于同步的HashMap,ConcurrentSkipListMap通产优于同步的TreeMap。当期望的读数和遍历远远大于列表的更新数时,CopyOnWriteArrayList优于同步的ArrayList。
案例:
import java.util.ArrayList; import java.util.Collections; import java.util.Iterator; import java.util.List; import java.util.concurrent.CopyOnWriteArrayList; /** * CopyOnWriteArrayList:写入并复制,效率低, * 添加操作多时,效率低,因为每次添加时都会进行复制,开销非常的大 * 并发迭代多时可以选择。 */ public class TestCopyOnWriteArrayList { public static void main(String[] args) { HelloThread ht = new HelloThread(); for(int i = 0;i<10;i++){ new Thread(ht).start(); } } } class HelloThread implements Runnable{ /** * 这种方式会出错:java.util.ConcurrentModificationException */ //private static List<String> list = Collections.synchronizedList(new ArrayList<String>()); private static CopyOnWriteArrayList<String> list = new CopyOnWriteArrayList<String>(); static { list.add("AA"); list.add("BB"); list.add("CC"); } public void run() { Iterator<String> it = list.iterator(); while(it.hasNext()){ System.out.println(it.next()); } list.add("DD"); } } 注意:CopyOnWriteArrayList:写入并复制。添加操作多时,效率低,因为每次添加时都会进行复制,开销非常的大;并发迭代多时可以选择。