我在创建一个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;
}
但我真的不希望每次使用它时都要进行检查。这里有什么我能做得更好的吗?
发布于 2013-03-13 02:43:42
您只需覆盖initialValue()
方法:
private static ThreadLocal<List<String>> myThreadLocal =
new ThreadLocal<List<String>>() {
@Override public List<String> initialValue() {
return new ArrayList<String>();
}
};
发布于 2013-03-13 03:00:45
您的解决方案很好。稍微简化一下:
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
函数接口。
发布于 2017-05-24 17:00:23
在JDK8中,公认的答案已过时。这是自那时以来最好的方法:
private static final ThreadLocal<List<Foo>> A_LIST =
ThreadLocal.withInitial(ArrayList::new);
https://stackoverflow.com/questions/15369476
复制相似问题