首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >如何在Java中初始化ThreadLocal对象

如何在Java中初始化ThreadLocal对象
EN

Stack Overflow用户
提问于 2013-03-13 02:41:15
回答 3查看 24.1K关注 0票数 30

我在创建一个ThreadLocal并用新的ThreadLocal初始化它时遇到了一个问题。问题是,从概念上讲,我只想要一个持续线程生命周期的持久列表,但是我不知道在Java中是否有一种方法可以针对每个线程初始化一些东西。

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

代码语言:javascript
复制
ThreadLocal static {
  myThreadLocalVariable.set(new ArrayList<Whatever>());
}

这样它就会为每个线程初始化它。我知道我能做到:

代码语言:javascript
复制
private static Whatever getMyVariable() {
  Whatever w = myThreadLocalVariable.get();
  if(w == null) {
    w = new ArrayList<Whatever>();
    myThreadLocalVariable.set(w);
  }
  return w; 
}

但我真的不希望每次使用它时都要进行检查。这里有什么我能做得更好的吗?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2013-03-13 02:43:42

您只需覆盖initialValue()方法:

代码语言:javascript
复制
private static ThreadLocal<List<String>> myThreadLocal =
    new ThreadLocal<List<String>>() {
        @Override public List<String> initialValue() {
            return new ArrayList<String>();
        }
    };
票数 40
EN

Stack Overflow用户

发布于 2013-03-13 03:00:45

您的解决方案很好。稍微简化一下:

代码语言:javascript
复制
private static Whatever getMyVariable() 
{
    Whatever w = myThreadLocalVariable.get();
    if(w == null) 
        myThreadLocalVariable.set(w=new Whatever());
    return w; 
} 

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

代码语言:javascript
复制
ThreadLocal<ArrayList<Whatever>> myThreadLocal = ThreadLocal.withInitial(ArrayList::new);

它使用Supplier函数接口。

票数 20
EN

Stack Overflow用户

发布于 2017-05-24 17:00:23

在JDK8中,公认的答案已过时。这是自那时以来最好的方法:

代码语言:javascript
复制
private static final ThreadLocal<List<Foo>> A_LIST = 
    ThreadLocal.withInitial(ArrayList::new);
票数 19
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/15369476

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档