31

我在创建 ThreadLocal 并使用 new 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; 
}

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

4

3 回答 3

41

您只需覆盖该initialValue()方法:

private static ThreadLocal<List<String>> myThreadLocal =
    new ThreadLocal<List<String>>() {
        @Override public List<String> initialValue() {
            return new ArrayList<String>();
        }
    };
于 2013-03-12T18:43:42.080 回答
21

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

private static final ThreadLocal<List<Foo>> A_LIST = 
    ThreadLocal.withInitial(ArrayList::new);
于 2017-05-24T09:00:23.433 回答
20

你的解决方案很好。一点简化:

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

在 Java 8 中,我们能够做到:

ThreadLocal<ArrayList<Whatever>> myThreadLocal = ThreadLocal.withInitial(ArrayList::new);

它使用Supplier<T>功能接口。

于 2013-03-12T19:00:44.710 回答