ConcurrentHashMap
- Java kursu
- İleri seviye
- Ders 64/82
- 5 dk
ConcurrentHashMap ile paralel haritayı öğrenirsin.
ConcurrentHashMap
ConcurrentHashMap, iş parçacığı güvenli bir haritadır. HashMap'ten farklı olarak aynı anda birçok iş parçacığı okuyup yazabilir; synchronized kilidi gerekmez.
ConcurrentHashMap<String, Integer> map =
new ConcurrentHashMap<>();
map.put("a", 1);
map.put("b", 2);Dahili olarak segmentler halinde kilitlenir; bu yüzden çoğu işlem paralel yapılır. computeIfAbsent, merge gibi yöntemler atomik güncelleme sağlar. Bu, yüksek hacimli önbellek ve sayaçlar için idealdir.
Atomik güncellemeler
computeIfAbsent anahtar yoksa değeri hesaplar ve ekler; atomik olarak yapar. merge ise mevcut değerle birleştirir.
map.computeIfAbsent("a", k -> 0);
map.merge("a", 1, Integer::sum); // 0 + 1 = 1Bu yöntemler, yoksa-ekle ve güncelle desenlerini kilitsiz yapar. Yarış koşullarını önler; kod hem daha güvenli hem daha kısadır. Yüksek hacimli sayaç uygulamalarında standart yaklaşımdır.
Uygulama ConcurrentHashMap ile sayaç
Bir CounterDemo sınıfında main yaz; ConcurrentHashMap<String, Integer> oluştur. map.merge("a", 1, Integer::sum) çağrısını üç kez yap. Son olarak map.get("a") sonucunu yazdır.
Başlangıç kodu
import java.util.concurrent.*;
// CounterDemo sınıfında main yaz
// ConcurrentHashMap oluştur; merge ile "a" anahtarını üç kez artır; get sonucunu yazdırÖrnek çözüm
import java.util.concurrent.*;
class CounterDemo {
public static void main(String[] args) {
ConcurrentHashMap<String, Integer> map = new ConcurrentHashMap<>();
map.merge("a", 1, Integer::sum);
map.merge("a", 1, Integer::sum);
map.merge("a", 1, Integer::sum);
System.out.println(map.get("a"));
}
}Beklenen çıktı
3
Soru ve cevaplar
Dersin sorularını cevaplarıyla birlikte inceleyebilirsin. Kendini denemek istersen dersi interaktif olarak çöz.
1 ConcurrentHashMap'in HashMap'ten farkı nedir?
- Daha yavaştır
- Sadece String anahtar alır
- Sıralıdır
- İş parçacığı güvenlidir Doğru cevap
Açıklama: ConcurrentHashMap iş parçacığı güvenlidir.
2 ConcurrentHashMap yöntemlerini eşleştir
| Kavram | Anlamı |
|---|---|
put |
Değer ekler |
get |
Değer okur |
computeIfAbsent |
Yoksa hesaplar |
merge |
Birleştirir |
3 computeIfAbsent çağrısını tamamla
ConcurrentHashMap<String, Integer> map = new ConcurrentHashMap<>();
map.____("a", k -> 0);
ConcurrentHashMap<String, Integer> map = new ConcurrentHashMap<>();
map.computeIfAbsent("a", k -> 0);
Açıklama: computeIfAbsent yoksa değeri hesaplar.