1. 程式人生 > >Java併發包:ConcurrentMap

Java併發包:ConcurrentMap

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。