Per-bucket locking + CAS (Java 8 style). Threads inserting into different buckets run in parallel; threads hitting the same bucket serialize. Watch a lock-free CAS install into an empty bucket, a synchronized-on-head insert into a populated one, and a cooperative concurrent resize that transfers buckets behind ForwardingNode markers.
| Operation | Avg | Worst (chain) | Worst (tree-bin) | Sync cost |
|---|---|---|---|---|
| get(k) | O(1) | O(n) | O(log n) | lock-free |
| put(k) — empty bucket | O(1) | O(1) | O(1) | 1 CAS |
| put(k) — populated | O(1) | O(n) | O(log n) | sync(head) |
| remove(k) | O(1) | O(n) | O(log n) | sync(head) |
| resize | O(n) total | O(n) | O(n) | cooperative |
| size() | O(cells) | O(cells) | O(cells) | striped, approx |