如何在Java中初始化ThreadLocal对象

我有一个问题,我正在创建一个ThreadLocal并使用新的ThreadLocal初始化它。 问题是,我在概念上只想要一个持久的列表,这个列表会延续线程的生命,但我不知道是否有办法在Java中初始化每个线程的东西。

例如,我想要的是:

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

这样它就可以为每个线程初始化它。 我知道我可以这样做:

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

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

您只需覆盖initialValue()方法:

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

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

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

在Java 8中,我们能够:

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

它使用Supplierfunction界面。

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

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