Add lru-cache module: LinkedHashMap and hand-rolled DLL LRU, coarse-lock/striped thread-safe variants, broken ReadWriteLock demo, Caffeine reference, 43 tests, JMH harness

Co-Authored-By: Claude Sonnet 5.5 <[email protected]>
Claude-Session: https://claude.ai/code/session_017ic4b4VQVEJWetTT1dYzyJ
This commit is contained in:
2026-10-29 05:52:27 +00:00
co-authored by Claude Sonnet 5.5
parent 4a376b94e9
commit 0457cf4bfb
31 changed files with 1425 additions and 0 deletions
+32
View File
@@ -0,0 +1,32 @@
# lru-cache
Runnable companion for the ankurm.com article
[LRU Cache in Java: LinkedHashMap, HashMap + Doubly Linked List and a Thread-Safe Version](https://ankurm.com/lru-cache-in-java/).
Three LRU caches, three thread-safe variants, a Caffeine reference, a deliberately broken
`ReadWriteLock` version, correctness and stress tests, and a short JMH comparison.
| Component | Version | Verified against |
|---|---|---|
| JDK | 25.0.5+8 (Temurin, LTS) | `java -version` |
| JUnit | 6.1.3 | `maven-metadata.xml` on Maven Central |
| Caffeine | 3.3.1 | `maven-metadata.xml`; GitHub release page lists it as Latest |
| JMH | 1.37 | `maven-metadata.xml` |
```bash
export JAVA_HOME=/path/to/jdk-25 && export PATH="$JAVA_HOME/bin:$PATH"
cd lru-cache
mvn test # 43 tests; rewrites output/01-08
./scripts/run-all.sh # also regenerates output/09 (broken-lock demo) and 10 (JMH)
```
| Source | What it is |
|---|---|
| `LinkedHashMapLruCache` | `LinkedHashMap(accessOrder=true)` + `removeEldestEntry` |
| `HashMapLruCache` | `HashMap` + hand-rolled doubly linked list with sentinel head/tail |
| `SynchronizedLruCache`, `ReentrantLockLruCache` | one coarse lock around variant 2 |
| `StripedLruCache` | N independent segments, LRU per segment (not global) |
| `BrokenReadWriteLockLruCache`, `BrokenLockDemo` | the tempting wrong answer, and what it does |
| `CaffeineLru`, `bench/LruBenchmark` | production reference and the JMH harness |
`output/09` and `output/10` are measurements from a shared 2-vCPU sandbox: indicative, not asserted.