【发布时间】:2014-04-17 21:31:50
【问题描述】:
我们看到一个问题,因为 ThreadLocal 的 initialValue() 被多次调用。
private static class MonMetricsTLS extends ThreadLocal<IMonitor> {
public MonMetricsTLS(MetricConfig config) {
this.config = config;
Timer timer = new Timer(true);
}
@Override
protected IMonitor initialValue() {
IMonitor mon = new MonitorImpl(config);
timer.schedule(new SenderTimerTask(mon), config.senderPeriodMs(), config.senderPeriodMs());
return mon;
}
}
在第一次和第二次调用之间,计时器可能会变坏,我们会在 schedule() 中得到非法状态异常。
为什么每个线程会被多次调用?
【问题讨论】:
-
你能告诉我们你是如何使用它的吗?
-
这是实际代码吗?为什么构造函数中有多余的本地
Timer?你在哪里初始化this.timer? -
否则您在
initialValue()中引用的计时器必须在您的外部类中声明为静态。是这样吗? -
constr 中的计时器不是多余的 - 它在初始值中使用
-
我们不知道该调用在哪里使用,所以我们不知道是什么调用了它所覆盖的方法。请告诉我们您在哪里以及如何使用该类
标签: java thread-local