如何在 Java 中初始化 ThreadLocal 对象

2022-09-01 10:14:02

我遇到了一个问题,我正在创建一个ThreadLocal并使用新的ThreadLocal对其进行初始化。问题是,从概念上讲,我真的只是想要一个持久的列表,它持续线程的生命周期,但我不知道是否有办法在Java中初始化每个线程的东西。

例如,我想要的是这样的东西:

ThreadLocal static {
  myThreadLocalVariable.set(new ArrayList<Whatever>());
}

以便它为每个线程初始化它。我知道我可以做到这一点:

private static Whatever getMyVariable() {
  Whatever w = myThreadLocalVariable.get();
  if(w == null) {
    w = new ArrayList<Whatever>();
    myThreadLocalVariable.set(w);
  }
  return w; 
}

但我真的宁愿每次使用时都不必对其进行检查。我在这里还有什么比这更好的吗?


答案 1

您只需重写该方法:initialValue()

private static ThreadLocal<List<String>> myThreadLocal =
    new ThreadLocal<List<String>>() {
        @Override public List<String> initialValue() {
            return new ArrayList<String>();
        }
    };

答案 2

接受的答案在JDK8中已经过时了。这是从那时起最好的方法:

private static final ThreadLocal<List<Foo>> A_LIST = 
    ThreadLocal.withInitial(ArrayList::new);

推荐