`ThreadLocal` 是一种提供线程内部局部变量的机制,确保在多线程环境下,每个线程都能独立访问自己的变量副本,互不干扰,从而实现线程隔离和数据传递,减少了公共变量传递的复杂性。它与 `synchronized` 不同,`ThreadLocal` 采用“以空间换时间”的策略(每个线程拥有独立副本),避免了同步带来的性能损耗,而 `synchronized` 采用“以时间换空间”(共享变量,排队访问)。
其核心设计并非 `ThreadLocal` 维护一个 `Map<Thread, Value>`,而是每个 `Thread` 对象内部维护一个 `ThreadLocalMap`。此 `Map` 以 `ThreadLocal` 实例本身为键,线程局部变量的值为值。这种设计减少了单个 `Map` 的条目数,并在线程销毁时自动销毁 `ThreadLocalMap`,优化了内存使用。
常用方法包括 `set()`、`get()` 和 `remove()`。特别强调,使用完毕后务必调用 `remove()` 方法,以防止内存泄漏。`set()` 和 `get()` 方法都通过当前线程获取其内部的 `ThreadLocalMap` 来存储或检索值。