ConcurrentHashMap与HashTable的区别

HashTable:
并行转换为串行,并行访问时只有一个线程能进来访问HashTable,下一个线程才能进来,效率非常低下,它还存在一些复合操作上的问题,比如说,不存在则添加,若存在则删除,代码中体现类似于!table.contains(),若不存在则添加put操作,contains(),put()方法都有可能有自己独立的锁,但是它们拆分开来了,这时第一个线程抢到了
contains()的锁,第二个线程再做同样的操作时被它抢去了,也成功put()添加了,这种复合操作也是线程不安全的;

concurrentHashMap:
采用的锁分段机制,锁分段机制指的是,首先它有一个并发级别concurrentLevel,默认的级别为16,默认它有16个段,段指的是segment,然后每个segment中默认也有16Hash表层,在每个表中又产生了一个个链表(内有前后索引等),默认16段,每个段有独立的表,然后形成一个链,好处:每个段它都是一个独立的锁,意味着当有多个线程并发访问时,可以实现并行访问,比HashTable的效率好很多,允许多个线程同时访问这个map时,不仅线程安全了,并且并行访问效率也高了。
ConcurrentHashMap与HashTable的区别ConcurrentHashMap与HashTable的区别
java5.0 在java.util.concurrent包中提供了多种并发容器类来改进同步容器的性能;
ConcurrentHashMap 同步容器类是Java5增加的一个线程安全的哈希表。对于多线程的操作,介于HashMap与
HashTable之间。内部采用"锁分段"机制替代了HashTable的独占锁,进而提高性能。
此包还提供了设计用于多线程上下文中的Collection实现;
ConcurrentHashMap、ConcurrentSkipListMap、ConcurrentSkipListSet、CopyOnWriteArrayList和
CopyOnWriteArraySet.当期望许多线程访问一个给定Collection时,ConcurrentHashMap通常优于同步的HashMap
ConcurrentSkipListMap通常优于同步的TreeMap,当期望的读数和遍历远远大于列表的更新数时,CopyOnWriteArrayList优于同步的ArrayList。

class HelloThread implements Runnable{
     private static List<String> list = Collections.synchronizedList(new ArrayList<String>());
     static {
          list.add("AA");
          list.add("BB");
          list.add("CC");
     }
     @Override
     public void run(){
           Iterator<String> it = list.iterator();
           while(it.hasNext()){
                System.out.println(it.next());
                list.add("AA");
           }
     }
}

上边的代码迭代访问并添加元素,collections.synchronizedList并发时受限,会发生并发修改异常,因为它迭代和修改操作的是同一个数据源,
ConcurrentHashMap与HashTable的区别
这样问题就解决了
CopyOnWriteArrayList/CopyOnWriteArraySet:写入并复制
CopyOnWriteArrayList当写入时,它都会在底层完成复制,复制一个新的列表;