並發集合(三)
----------
使用ConcurrentMap實作類別
java.util.concurrent.ConcurrentMap介面和ConcurrentHashMap實作類別 只能在鍵不存在時將元素加入到map中,只有在鍵存在並映射到特定值時才能從map中刪除一個元素。主要定義了下面幾個方法(K表示鍵的類型,V表示值的類型):
1. V putIfAbsent(K key,V value) : 如果指定鍵已經不再與某個值相關聯,則將它與給定值關聯。
2. boolean remove(Object key,Object value) : 只有目前將鍵的條目映射到給定值時,才移除該鍵的條目。
3. boolean replace(K key,V oldValue,V newValue) : 只有目前將鍵的條目映射到給定值時,才替換該鍵的條目。
4. V replace(K key,V value) : 只有目前將鍵的條目映射到某一值時,才替換該鍵的條目。
putIfAbsent()方法用於在map中進行添加。這個方法以要添加到ConcurrentMap中的鍵的值為參數,就像普通的put()方法,但是只有在map不包含這個鍵時,才能將鍵加入到map中。如果map已經包含這個鍵,那麼這個鍵的現有值就會保留。putIfAbsent()方法是原子的。等價於下面的代碼(除了原子地執行此操作之外):
if(!map.containsKey(key))return map.put(key,value);elsereturn map.get(key)
像putIfAbsent()方法一樣,重載後的remove()方法有兩個參數:鍵和值。在調用時,只有當鍵映射到指定的值時才從map中刪除這個鍵。如果不匹配,那麼就不刪除這個鍵,並返回false。如果值匹配鍵的當前映射內容,那麼就刪除這個鍵,這個方法是原子性的。這種操作的等價原始碼(除了原子地執行此操作之外):
if(map.containsKey(key) && map.get(key).equals(value)){map.remove(key);return true;}else return false;總之,ConcurrentMap中定義的方法是原子性的。