Java并发包:ConcurrentMap

文章译自:http://tutorials.jenkov.com/java-util-concurrent/index.html
抽空翻译了一下这个教程的文章,后面会陆续放出,如有不妥,请批评指正。
转自请注明出处。
之前漏了一篇文章,这篇应该是在双端队列之后的,这里补上。

ConcurrentMap

java.util.concurrent.ConcurrentMap接口代表一个Map,它可以处理并发访问。ConcurrentMap除了继承自java.util.Map的方法,还有一些自己的原子方法。

ConcurrentMap的具体实现

由于ConcurrentMap是一个接口类,使用时需要使用它的实现类。Java.util.concurrent包中有下面关于ConcurrentMap接口的实现类。

  • ConcurrentHashMap

ConcurrentHashMap

ConcurrentHashMap除了有更好的并行性,它与java.util.HashTable类时非常相似的。当你从ConcurrentHashMap读取数据的时候ConcurrentHashMap是不会加锁的。另外,ConcurrenthashMap在写的时候不会全部加锁。它仅仅锁住Map中正在被写入的部分。

ConcurrentHashMap的另一个不同之处是,如果在迭代的时候ConcurrentHashMap被修改了,ConcurrentHashMap是不会抛出ConcurrentModificationException异常的。迭代器不能被超过一个以上的线程使用。

查看官方文档获取ConcurrentMap和ConcurrentHashMap更详细的信息。

ConcurrentMap实例

ConcurrentMap concurrentMap = new ConcurrentHashMap();

concurrentMap.put("key", "value");

Object value = concurrentMap.get("key");

ConcurrentNavigableMap

java.util.concurrent.ConcurrentNavgableMap接口类是一种支持并行访问的java.util.NavigableMap,并且它的子map也支持并行访问,子map是通过headMap(),subMap()和tailMap()等方法返回的。

这里不重新解释NavigableMap中已有的相同方法,我们仅看看在ConcurrentNavigableMap中增加的一些方法。

haedMap()

headMap(T toKey) 返回一个包含许多键的map,其中所有键值是严格少于给定的toKey。

如果你改变了原始的map,这些改变也会反映到head map上。

下面的例子说明了headMap()方法的使用。

ConcurrentNavigableMap map = new ConcurrentSkipListMap();

map.put("1", "one");
map.put("2", "two");
map.put("3", "three");

ConcurrentNavigableMap headMap = map.headMap("2");

headMap将会指向一个仅仅包含key为“1”的ConcurrentNavigableMap,因为只有这个key是严格小于“2”的。ConcurrentSkipListMap是ConcurrentNavigableMap的实现类。

查看JavaDoc了解这个方法以及它的重载版本更详细的执行情况。

tailMap()

tailMap(T fromKey)返回一个包含许多键的map,其中所有键值是大于或者等于给定的fromKey的。

如果你改变了原始的map,这些改变也会反映到head map上。

下面的例子说明了tailMap()方法的使用。

ConcurrentNavigableMap map = new ConcurrentSkipListMap();

map.put("1", "one");
map.put("2", "two");
map.put("3", "three");

ConcurrentNavigableMap tailMap = map.tailMap("2");

tailMap将包含“2”、“3”两个键,因为这两个键是大于或者等于给定的键值“2”。
查看JavaDoc了解这个方法以及它的重载版本更详细的执行情况。

subMap()

subMap()方法返回一个包含许多键的map,这些键值是介于传给该方法的(including)和(excluding)两个参数之间的,下面是一个例子:

ConcurrentNavigableMap map = new ConcurrentSkipListMap();

map.put("1", "one");
map.put("2", "two");
map.put("3", "three");

ConcurrentNavigableMap subMap = map.subMap("2", "3");

方法返回的subMap仅包含一个key等于“2”的键值对,因为只有这个键是大于或等“2”,并且小于“3”的。

更多方法

ConcurrentNavigableMap接口还包含跟多的一些方法也许会用到的,例如:

  • descendingKeySet()
  • descendingMap()
  • navigableKeySet()

更多信息请查看官方JavaDoc。

你可能感兴趣的:(java,Java高并发)