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