Java Concurrency - ConcurrentMap Arayüzü
Bir java.util.concurrent.ConcurrentMap arayüzü, Harita arayüzünün bir alt arayüzüdür ve temel alınan harita değişkeninde atomik işlemleri destekler. Uçucu değişkenler üzerinde okuma ve yazma gibi çalışan alma ve ayarlama yöntemlerine sahiptir. Diğer bir deyişle, bir küme, aynı değişken üzerindeki sonraki herhangi bir get ile önceden-olan ilişkisine sahiptir. Bu arayüz, iplik güvenliği ve atomiklik garantileri sağlar.
ConcurrentMap Yöntemleri
Sr.No. | Yöntem ve Açıklama |
---|---|
1 | default V compute(K key, BiFunction<? super K,? super V,? extends V> remappingFunction) Belirtilen anahtar ve onun geçerli eşlenen değeri için bir eşlemeyi hesaplama girişimleri (veya geçerli eşleme yoksa null). |
2 | default V computeIfAbsent(K key, Function<? super K,? extends V> mappingFunction) Belirtilen anahtar zaten bir değerle ilişkilendirilmemişse (veya null ile eşlenmişse), verilen eşleme işlevini kullanarak değerini hesaplamaya çalışır ve boş olmadığı sürece bu haritaya girer. |
3 | default V computeIfPresent(K key, BiFunction<? super K,? super V,? extends V> remappingFunction) Belirtilen anahtarın değeri mevcutsa ve boş değilse, anahtar ve geçerli eşlenen değeri verilen yeni bir eşlemeyi hesaplamaya çalışır. |
4 | default void forEach(BiConsumer<? super K,? super V> action) Tüm girişler işlenene veya eylem bir istisna atana kadar bu haritadaki her giriş için verilen eylemi gerçekleştirir. |
5 | default V getOrDefault(Object key, V defaultValue) Belirtilen anahtarın eşlendiği değeri veya bu harita anahtar için hiç eşleme içermiyorsa defaultValue döndürür. |
6 | default V merge(K key, V value, BiFunction<? super V,? super V,? extends V> remappingFunction) Belirtilen anahtar zaten bir değerle ilişkilendirilmemişse veya null ile ilişkilendirilmişse, onu verilen boş olmayan değerle ilişkilendirir. |
7 | V putIfAbsent(K key, V value) Belirtilen anahtar zaten bir değerle ilişkilendirilmemişse, onu verilen değerle ilişkilendirin. |
8 | boolean remove(Object key, Object value) Bir anahtar için girişi, yalnızca o anda belirli bir değerle eşlenmişse kaldırır. |
9 | V replace(K key, V value) Bir anahtar girişini, yalnızca o anda bir değerle eşlenmişse değiştirir. |
10 | boolean replace(K key, V oldValue, V newValue) Bir anahtar için girişi, yalnızca o anda belirli bir değerle eşlenmişse değiştirir. |
11 | default void replaceAll(BiFunction<? super K,? super V,? extends V> function) Tüm girdiler işlenene veya işlev bir istisna atana kadar her girdinin değerini, söz konusu girdide verilen işlevi çağırmanın sonucuyla değiştirir. |
Misal
Aşağıdaki TestThread programı ConcurrentMap vs HashMap'in kullanımını gösterir.
import java.util.ConcurrentModificationException;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;
public class TestThread {
public static void main(final String[] arguments) {
Map<String,String> map = new ConcurrentHashMap<String, String>();
map.put("1", "One");
map.put("2", "Two");
map.put("3", "Three");
map.put("5", "Five");
map.put("6", "Six");
System.out.println("Initial ConcurrentHashMap: " + map);
Iterator<String> iterator = map.keySet().iterator();
try {
while(iterator.hasNext()) {
String key = iterator.next();
if(key.equals("3")) {
map.put("4", "Four");
}
}
} catch(ConcurrentModificationException cme) {
cme.printStackTrace();
}
System.out.println("ConcurrentHashMap after modification: " + map);
map = new HashMap<String, String>();
map.put("1", "One");
map.put("2", "Two");
map.put("3", "Three");
map.put("5", "Five");
map.put("6", "Six");
System.out.println("Initial HashMap: " + map);
iterator = map.keySet().iterator();
try {
while(iterator.hasNext()) {
String key = iterator.next();
if(key.equals("3")) {
map.put("4", "Four");
}
}
System.out.println("HashMap after modification: " + map);
} catch(ConcurrentModificationException cme) {
cme.printStackTrace();
}
}
}
Bu, aşağıdaki sonucu verecektir.
Çıktı
Initial ConcurrentHashMap: {1 = One, 2 = Two, 3 = Three, 5 = Five, 6 = Six}
ConcurrentHashMap after modification: {1 = One, 2 = Two, 3 = Three, 4 = Four, 5 = Five, 6 = Six}
Initial HashMap: {1 = One, 2 = Two, 3 = Three, 5 = Five, 6 = Six}
java.util.ConcurrentModificationException
at java.util.HashMap$HashIterator.nextNode(Unknown Source)
at java.util.HashMap$KeyIterator.next(Unknown Source)
at TestThread.main(TestThread.java:48)