ThreadLocal通过为每个线程提供独立变量副本实现线程隔离,其值存储于线程的ThreadLocalMap中,键为ThreadLocal实例,避免并发冲突。
在Java中,ThreadLocal 是一种实现线程局部变量的机制。每个线程对该变量的操作都基于自己独立的副本,互不干扰。这种机制特别适用于需要避免共享状态引发并发问题的场景,比如数据库连接、用户会话信息、上下文传递等。
ThreadLocal 并不是将变量“绑定”到线程对象本身,而是通过每个线程内部持有的 ThreadLocalMap 来存储变量副本。这个Map的键是 ThreadLocal 实例,值是该线程对应的变量副本。因此,不同线程访问同一个 ThreadLocal 实例时,实际获取的是各自线程中的独立副本。
1. set(T value)
设置当前线程中该 ThreadLocal 变量的副本值。
示例:
ThreadLocal2. get()
获取当前线程中该 ThreadLocal 变量的副本值。如果尚未设置,返回 null(除非重写了 initialValue())。
示例:
String value = threadLocal.get();3. remove()
删除当前线程中该 ThreadLocal 变量的副本。用于防止内存泄漏,尤其是在使用线程池时非常重要。
示例:
threadLocal.remove();4. initialValue()
protected 方法,
可被子类重写,用于提供变量的初始值。它在第一次调用 get() 时执行,且只执行一次。
示例:创建一个自动初始化为当前时间的 ThreadLocal
ThreadLocal基本上就这些。合理使用 ThreadLocal 能有效隔离线程间的状态冲突,关键在于理解其作用范围和资源清理机制。