如何在Java中初始化ThreadLocal对象

时间:2013-03-12 18:41:15

标签: java thread-local static-block

我遇到了一个问题,即创建ThreadLocal并使用新的ThreadLocal进行初始化。问题是,我在概念上只想要一个持久的列表,这个列表会延续线程的生命,但我不知道是否有一种方法可以在Java中初始化每个线程的东西。

E.g。我想要的是:

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; 
}

但是我每次使用它时都不需要检查它。我能在这做什么更好的事情吗?

3 个答案:

答案 0 :(得分:31)

您只需覆盖initialValue()方法:

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

答案 1 :(得分:17)

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

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>功能界面。

答案 2 :(得分:9)

JDK8中已接受的答案已过时。这是自那时以来最好的方式:

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