CodeBlanks Logo Icon CodeBlanks

ConcurrentHashMap

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 = 1

Bu 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

Main.java
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

Main.java
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

Soru
ConcurrentHashMap<String, Integer> map = new ConcurrentHashMap<>();
map.____("a", k -> 0);
Cevap
ConcurrentHashMap<String, Integer> map = new ConcurrentHashMap<>();
map.computeIfAbsent("a", k -> 0);

Açıklama: computeIfAbsent yoksa değeri hesaplar.

İleri seviye bölümündeki tüm dersler