gpt4 book ai didi

java - ThreadLocal initialValue() 每个线程调用多次。为什么?

转载 作者:行者123 更新时间:2023-11-30 11:19:36 26 4
gpt4 key购买 nike

由于多次调用 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() 中得到 illegalstateexception。

为什么每个线程会被调用多次?

最佳答案

这看起来像您在多个线程中使用相同的 Timer 对象。您应该将 new Timer() 移动到 initialValue() 中。只有这样,您才能确保每个线程都有一个唯一的 Timer 对象。从您的代码中猜测,config 是不可变的,因此您可以将 this 传递给计时器。然后,您只需创建一个 MonMetrics 并在所有线程中重复使用它。

关于java - ThreadLocal initialValue() 每个线程调用多次。为什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23143829/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com