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:
@@ -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.
|
||||
Reference in New Issue
Block a user