【发布时间】:2018-02-16 07:42:01
【问题描述】:
我正在使用 InheritableThreadlocal 和 HashMap 来存储我所有的线程局部变量。
class MyThreadLocalMap {
private final static ThreadLocal<HashMap<String, Object>> THREAD_VARIABLES = new InheritableThreadLocal<HashMap<String, Object>>() {
@Override
protected HashMap<String, Object> initialValue() {
return new HashMap<>();
}
};
public static Object get(String name) {
return THREAD_VARIABLES.get().get(name);
}
public static Object set(String name, Object value) {
Object currentValue = get(name);
THREAD_VARIABLES.get().put(name, value);
return currentValue;
}
}
这一直很好,直到昨天突然出现一个奇怪的错误。
我正在使用 tomcat 服务器来运行我的 Web 应用程序。我使用ScheduledThreadPoolExecutor 创建线程池并在多个线程中运行任务。我的代码的缩写形式与此类似。
MyThreadLocalMap.set("MyKey", 1);
....
....
Object obj = MyThreadLocalMap.get("MyKey");
if(!Integer.valueOf(1).equals(obj))
throw new Exception("threadlocal mismatch!");
....
....
MyThreadLocalMap.set("MyKey", null);
上面的代码将在多个线程中执行,并且由于我使用的是线程池,因此相同的线程将被重用。
奇怪的是,在大约 5 个线程成功执行后,其中一个线程抛出了“threadlocal mismatch”异常!
我的主要怀疑是使用 InheritableThreadLocal(因内存泄漏而臭名昭著)
我尝试并重试在开发服务器中重现该问题,但我无法做到。而且我不想冒险在生产服务器中进行测试。
【问题讨论】:
标签: java threadpool thread-local