java threadlocal
ThreadLocal 是 Java 中的一个类,用来为每个线程保存独立的变量副本。它和“线程隔离”“并发编程”密切相关,常出现在多线程共享数据但需要避免互相干扰的场景里。
基本含义与用途
简单说,ThreadLocal 让同一个变量在不同线程中各有各的值,线程之间互不影响。典型用途包括保存用户登录信息、数据库连接、事务上下文等,这些数据在同一个线程的调用链中需要随时取用,但不应被其他线程看到。它常被比作“线程的私有储物柜”,每个线程存取自己的那一份。
常见问题
使用 ThreadLocal 最容易踩的坑是内存泄漏。因为线程池中的线程会长期存活,ThreadLocal 变量若用完后没有调用 remove(),其对应的值可能一直挂在 Thread 上无法回收。此外,父子线程之间默认不共享 ThreadLocal 值,需要借助 InheritableThreadLocal 或更现代的传递方式。还有一点:ThreadLocal 并不解决共享变量的并发修改问题,它只是隔离,不是同步。
怎么判断或怎么选
判断是否该用 ThreadLocal,可以问自己:这份数据是否只属于当前线程、是否需要在多个方法间隐式传递、是否不想通过参数层层传递。如果答案是肯定的,可以考虑使用。使用时务必在 finally 中调用 remove(),尤其是在线程池环境。若需要跨线程传递,优先考虑框架提供的上下文传递机制,而不是盲目依赖 InheritableThreadLocal。对于普通共享状态,仍应使用锁或并发容器,而不是 ThreadLocal。