Skip to content

Commit 1c37aac

Browse files
committed
ConcurrentHashMap Internal Working (Java 7 vs Java 8)
Signed-off-by: https://github.com/Someshdiwan <[email protected]>
1 parent 70f1a40 commit 1c37aac

File tree

1 file changed

+71
-0
lines changed

1 file changed

+71
-0
lines changed
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,71 @@
1+
ConcurrentHashMap Internal Working (Java 7 vs Java 8)
2+
3+
1. Java 7 — Segment-Based Locking
4+
---------------------------------
5+
- Table is divided into fixed number of **segments** (default = 16).
6+
- Each segment works like a mini-HashMap with its own lock.
7+
- Read → No lock (unless write in same segment).
8+
- Write → Lock only the segment, not the whole map.
9+
10+
ASCII:
11+
12+
ConcurrentHashMap
13+
+--------------------------------------+
14+
| Segment[0] | Segment[1] | ... | [15] |
15+
+--------------------------------------+
16+
17+
Each Segment = smaller HashMap
18+
(buckets + chaining)
19+
20+
Thread A → writes in Segment[0] → locks only Segment[0].
21+
Thread B → can write in Segment[1] simultaneously.
22+
23+
✔ Better concurrency than Hashtable (global lock).
24+
✘ Limited parallelism (max = #segments, e.g., 16).
25+
26+
27+
2. Java 8 — CAS + Bucket-Level Locking
28+
--------------------------------------
29+
- Segments removed, now a **single flat table** of buckets.
30+
- Relies on **CAS (Compare-And-Swap)** for atomic updates.
31+
- Per-bucket synchronization if CAS fails or collisions occur.
32+
- Bucket chain → linked list; if chain ≥ 8 → convert to TreeBin (Red-Black Tree).
33+
- Resizing done cooperatively by multiple threads.
34+
35+
ASCII:
36+
37+
Table (flat)
38+
+-----------------------------------------------+
39+
| 0 | 1 | 2 | 3 | 4 | ... |
40+
+-----------------------------------------------+
41+
42+
CAS insert directly → Node(key, val)
43+
44+
Collision → LinkedList / TreeBin
45+
46+
Threshold exceeded → Resize with ForwardingNodes
47+
48+
Thread A → inserts at bucket[2] (CAS).
49+
Thread B → inserts at bucket[5] simultaneously (no interference).
50+
51+
✔ Unlimited concurrency (per-bucket).
52+
✔ Lock-free reads.
53+
✔ Treeification improves worst-case.
54+
✘ Slightly more complex design than Java 7.
55+
56+
57+
3. Quick Comparison
58+
--------------------------------
59+
| Aspect | Java 7 (Segments) | Java 8 (CAS + Buckets) |
60+
|-------------------|------------------------------------|---------------------------------|
61+
| Lock granularity | Segment-level (default 16) | Bucket-level (fine-grained) |
62+
| Read operation | Mostly lock-free | Completely lock-free |
63+
| Write operation | Locks only one segment | CAS + per-bucket sync if needed |
64+
| Collisions | LinkedList only | LinkedList → TreeBin (log n) |
65+
| Resizing | By one thread | Cooperative (multi-thread) |
66+
| Concurrency Limit | # of segments (e.g., 16) | Much higher (bucket-level) |
67+
68+
69+
4. Where to Use:
70+
- **Java 7 style** → legacy systems.
71+
- **Java 8 style** → modern apps needing high scalability in multithreaded environments.

0 commit comments

Comments
 (0)