Java Concurrency - Antarmuka ConcurrentMap
Antarmuka java.util.concurrent.ConcurrentMap adalah subinterface antarmuka Map, mendukung operasi atom pada variabel peta yang mendasarinya. Ini telah mendapatkan dan menetapkan metode yang berfungsi seperti membaca dan menulis pada variabel volatil. Artinya, himpunan memiliki hubungan terjadi-sebelum dengan get berikutnya pada variabel yang sama. Antarmuka ini memastikan keamanan benang dan jaminan atomicity.
Metode ConcurrentMap
Sr.No. | Metode & Deskripsi |
---|---|
1 | default V compute(K key, BiFunction<? super K,? super V,? extends V> remappingFunction) Mencoba menghitung pemetaan untuk kunci yang ditentukan dan nilai yang dipetakan saat ini (atau null jika tidak ada pemetaan saat ini). |
2 | default V computeIfAbsent(K key, Function<? super K,? extends V> mappingFunction) Jika kunci yang ditentukan belum dikaitkan dengan sebuah nilai (atau dipetakan ke nol), mencoba untuk menghitung nilainya menggunakan fungsi pemetaan yang diberikan dan memasukkannya ke dalam peta ini kecuali null. |
3 | default V computeIfPresent(K key, BiFunction<? super K,? super V,? extends V> remappingFunction) Jika nilai untuk kunci yang ditentukan ada dan bukan nol, upaya untuk menghitung pemetaan baru dengan kunci tersebut dan nilai yang dipetakan saat ini. |
4 | default void forEach(BiConsumer<? super K,? super V> action) Melakukan tindakan yang diberikan untuk setiap entri di peta ini sampai semua entri telah diproses atau tindakan tersebut mengeluarkan pengecualian. |
5 | default V getOrDefault(Object key, V defaultValue) Menampilkan nilai yang dipetakan untuk kunci tertentu, atau defaultValue jika peta ini tidak berisi pemetaan untuk kunci tersebut. |
6 | default V merge(K key, V value, BiFunction<? super V,? super V,? extends V> remappingFunction) Jika kunci yang ditentukan belum dikaitkan dengan nilai atau dikaitkan dengan null, kaitkan dengan nilai bukan null yang diberikan. |
7 | V putIfAbsent(K key, V value) Jika kunci yang ditentukan belum dikaitkan dengan nilai, kaitkan dengan nilai yang diberikan. |
8 | boolean remove(Object key, Object value) Menghapus entri untuk kunci hanya jika saat ini dipetakan ke nilai tertentu. |
9 | V replace(K key, V value) Mengganti entri untuk kunci hanya jika saat ini dipetakan ke beberapa nilai. |
10 | boolean replace(K key, V oldValue, V newValue) Mengganti entri untuk kunci hanya jika saat ini dipetakan ke nilai tertentu. |
11 | default void replaceAll(BiFunction<? super K,? super V,? extends V> function) Mengganti nilai setiap entri dengan hasil pemanggilan fungsi yang diberikan pada entri tersebut sampai semua entri telah diproses atau fungsi tersebut mengeluarkan pengecualian. |
Contoh
Program TestThread berikut menunjukkan penggunaan ConcurrentMap vs HashMap.
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();
}
}
}
Ini akan menghasilkan hasil sebagai berikut.
Keluaran
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)