同步map的学习

首先,先说明map。Map用于存储“key-value”元素对,它将一个key映射到一个并且只能是惟一的一个value。Map可使用多种实现方式,HashMap的实现采用的是hash表;而TreeMap采用的是红黑树。安全

  1. HashTable 和 HashMap的不一样多线程

    它们都实现了Map接口,但HashTable还实现了Dictionary抽象类。在HashMap中,null能够做为键也能够做为值,因此不能用get方法来判断map中是否含有见,而是必须用containsKey方法来判断。而在HashTable中,不管是键仍是值,都不能用null。并发

    最大的不一样则在于HashTable为线程安全的,它的方法都是同步了的,能够直接在多线程环境下使用。HashMap则不是线程安全的,在多线程环境下,须要手动实现同步机制。Java中Collections类提供了一个方法用于返回一个同步版本的HashMap以便用于多线程环境中。
spa

 Java代码线程

  1. public static <K,V> Map<K,V> synchronizedMap(Map<K,V> m) {   指针

  2.     return new SynchronizedMap<K,V>(m);   orm

  3.  }接口

 但这样返回的SynchronizedMap页并非时时都线程安全的,好比,在判断了元素存在以后,进行删除操做,此时如有另外一个线程页判断元素存在,要进行删除操做是却发现元素已经不存在了就会抛出异常。进程

2. 更好的选择:ConcurrentHashMaprem

ConcurrentHashMap提供了一种与HashTable和SynchronizedMap中不一样的锁机制。HashTable采用的锁机制是一次锁住整个整个hash表,从而同一时刻只能由同一个线程进行操做。而ConcurrentMap则是一次锁住一个桶,默认将Hash表分为16个桶。get、put、remove操做只需锁住最经常使用的桶。如今能够有16个进程并发执行。而读操做通常不须要锁,只有size是需锁住整个hash表。

在迭代方面,ConcurrentHashMap页采起了一种新的迭代方式。iterator被建立后在发生改变也不会抛出ConcurrentModificationException异常,而是在改变是new新的数据,从而不影响原有的数据,在迭代完成后再将头指针替换为新的数据。这样读进程能够读取原有数据,而写进程也能够并发的改变数据。

相关文章
相关标签/搜索