ThreadLocal类提供了一种线程局部变量的机制,使得每个线程都可以拥有自己的变量副本,从而避免了线程安全问题。其主要API包括:
get()
:获取当前线程的变量副本。set(T value)
:设置当前线程的变量副本。initialValue()
:初始化当前线程的变量副本,可以通过重写该方法来实现自定义的初始化逻辑。基本用法如下:
public class MyThreadLocalClass {
private static final ThreadLocal<String> threadLocal = new ThreadLocal<>();
public static void setThreadLocalValue(String value) {
threadLocal.set(value);
}
public static String getThreadLocalValue() {
return threadLocal.get();
}
}
ThreadLocal常用于以下场景:
ThreadLocal可能导致内存泄漏的原因在于,当线程结束时,如果没有手动清除ThreadLocal中的变量副本,那么这些变量副本将会一直存在于内存中,无法被回收。如果长时间运行的线程频繁使用ThreadLocal,并且没有及时清理其中的变量副本,就会导致内存泄漏问题。
为了避免内存泄漏,需要在使用完ThreadLocal后及时调用remove()
方法清除当前线程的变量副本,或者使用ThreadLocal
的remove()
方法手动清除。另外,也可以使用InheritableThreadLocal
来确保子线程可以继承父线程的变量副本,从而减少内存泄漏的可能性。