首先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:写入并复制。添加操作多时,效率低,因为每次添加时都会进行复制,开销非常的大;并发迭代多时可以选择。