【发布时间】:2021-05-05 15:58:34
【问题描述】:
这是代码:
public class ContextManagerImpl implements ContextManager {
private static final ThreadLocal<Context> ctx = new ThreadLocal<Context>();
@Override
public Context getContext() {
if(ctx.get() == null) {
ctx.set(new Context("", "")); // Dummy context. This should never happen
}
return ctx.get();
}
@Override
public void begin(Context context){
ctx.set(context); // Verified context passed is never null or blank
}
@Override
public void end() {
if(ctx!= null) {
ctx.remove();
}
}
}
public final class Context implements Serializable {
private String s1;
private String s2;
}
有 2 个线程正在使用具有不同线程本地上下文的此类。它在大多数情况下都能正常工作,但有时即使 begin() 正确设置了 ctx 中的值,getContext() 也会返回虚拟上下文。 我怀疑某处存在导致这种情况的竞争条件,但鉴于 threadlocal set() 和 get() 是线程安全的,并且 ctx 的初始化是在声明期间完成的,这永远不会发生。 注意:我已经将 spring boot 升级到 3.4.3 但仍然使用 JDK 8。
【问题讨论】:
标签: java multithreading concurrency thread-safety thread-local