13 Ocak 2023 Cuma

ConcurrentHashMap computeIfPresent metodu - Key Varsa Thread Safe Value Güncelleme

Giriş
Key varsa atomic olarak yeni value atama içindir. Açıklaması şöyle.
If the value for the specified key is present, attempts to compute a new mapping given the key and its current mapped value. The entire method invocation is performed atomically. Some attempted update operations on this map by other threads may be blocked while computation is in progress, so the computation should be short and simple, and must not attempt to update any other mappings of this map.
1. Eğer BiFunction null dönerse entry silinir.
2. BiFunction exception fırlatamaz
3. computeIfPresent () çağrısının sonucu ya null ya da güncellenen value değeridir

Örnek
Bir seferinde iki tane thread ile şöyle bir şey yapmak gerekti. 
Birinci thread ConcurrentHashMap'i dolaşarak bayatlayan nesneleri siliyordu. İkinci thread ise gelen yeni değerleri value nesnesine ekliyordu. 

İlk önce ekleme işini computeIfPresent() içindeki BiFunction ile yapmak istedim. Ancak BiFunction exception fırlatan bir şey olmalıydı. Bu yüzden vaz geçtim ve value nesnesini ConcurrentHashMap.get() ile aldım. Birinci thread entry nesnesini silse bile, ben bir kere value nesnesini aldığım için sorun olmayacaktı

Örnek
Mevcut entry nesnesini silmek için şöyle yaparız.
map.computeIfPresent(k, (key, value) -> {
    //process the value here
    //key is k
    //value is the value to which k is mapped.

    return null; //return null to remove the entry
});

Hiç yorum yok:

Yorum Gönder