Java necə işləyir

Mövzu seç, kod yaz və daxildə nə baş verdiyini addım-addım gör.

Memory

Collection-lar

Concurrency

Dil və JVM

Mövzular

ConcurrentHashMap necə işləyir

Niyə HashMap kifayət etmir?

HashMap thread-safe deyil: eyni anda yazan thread-lər Node-ları itirə, resize-ı poza bilər.

Hashtable hər method-u bir lock-a bağlayır: thread-lər fərqli bucket-lərlə işləsələr də, bir-birini gözləyirlər.

ConcurrentHashMap lock-u bucket səviyyəsinə endirir: fərqli bucket-lər adətən bir-birinə mane olmur. Java 7-dəki Segment quruluşu Java 8-də ləğv olunub.

Boş bucket: CAS

Bucket boşdursa, lock almağa ehtiyac yoxdur. Thread CAS işlədir: null idisə, Node-u yaz.

İki thread eyni boş bucket-ə yazırsa, biri qalib gəlir. Digərinin CAS-ı uğursuz olur və put yenidən başlayır: indi bucket doludur.

Dolu bucket: lock

Bucket doludursa, thread ilk Node üzərində synchronized alır. Lock yalnız bu bucket üçündür.

Eyni bucket-ə yazan thread gözləyir, başqa bucket-ə yazan isə gözləmir. Hashtable-dan əsas fərq budur.

Niyə null olmaz?

HashMap-də get null qaytaranda containsKey ilə yoxlaya bilərsən: key yoxdur, yoxsa value null-dur?

Çox thread-də bu iki çağırış arasında map dəyişə bilər, ona görə cavab etibarlı olmur. Bu qarışıqlıq olmasın deyə ConcurrentHashMap null key və null value qəbul etmir.

Solda put(null, 1) düyməsini bas.

Resize: bir az tez və birlikdə

Burada 11 key var. Solda k12 üçün put bas: table 12-ci key-də böyüyür. HashMap isə 13-cü key-də böyüyür.

Köçürmə zamanı köçürülmüş bucket-ə ForwardingNode qoyulur. get onun vasitəsilə yeni table-a keçir, put edən thread isə köçürməyə kömək edir.

Yerini dəyişən Node-lar sağda işarələnir. Node-lar bəzən zəncirdə tərs sıraya düşür, bu da JDK kodu ilə eynidir.

Atomic əməliyyatlar və size

Hər çağırış ayrıca təhlükəsizdir, amma get, sonra put birlikdə atomic deyil: arada başqa thread yaza bilər.

Bunun üçün merge, compute, computeIfAbsent və putIfAbsent var.

size() təxmini də ola bilər: sayğac baseCount və CounterCell-lərə bölünüb. Thread-lər yazarkən nəticə dəqiq olmaya bilər.