`ThreadLocal` stores a separate value per thread (often used for request context). The common pitfall is thread pools: threads are reused, so values can “leak” between requests unless you clear them (`remove()` in a `finally`).