25 Aralık 2016 Pazar

ConcurrentSkipListMap Sınıfı

Giriş
TreeMap Sınıfının concurrent dünyaya uyarlanmış hali gibi düşünülebilir.

ConcurrentSkipListMap aynı zamanda bir ConcurrentNavigableMap ve NavigableMap. 

Kendi içinde red-black tree yerine skip list kullanıyor. QT dokümantasyonunda QMap'in de skip list kullandığı yazılı. why does qmap uses skiplist instead ob rb-tree? sorusunda da konuyla ilgili bilgi var. Sebep olarak ise
skip-lists result in less code in the executable and require less memory per node.
yazılmış. 

ceilingEntry metodu
When should I use ConcurrentSkipListMap? sorusunda ise ConcurrentSkipListMap'in ConcurrentHashMap'e göre ekle/çıkar/al işlemlerinde biraz daha yavaş olabileceği ancak elemanları sıralı tutması ve ceilingEntry(), ceilingKey() metodlar sunduğu için sıralı erişimin gerektiği yerlerde daha hızlı olduğu söylenmiş.

computeIfAbsent metodu
Açıklaması şöyle
ConcurrentSkipListMap is a thread-safe map and it will not through ConcurrentModificationException in recursive method while using computeIfAbsent().
Örnek
Şu kod ConcurrentModificationException fırlatmaz. Şöyle yaparız. Ama HashMap kullansaydık exception fırlatılırdı
Map<Integer, BigInteger> cache = new ConcurrentSkipListMap<>(
          Map.of(0, BigInteger.ZERO, 1, BigInteger.ONE)
);
public BigInteger fibonacci(int n) {
  return cache.computeIfAbsent(n,
    key -> fibonacci(key - 1).add(fibonacci(key - 2)));
}

Hiç yorum yok:

Yorum Gönder