如何在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);
它使用Supplier
function界面。
接受的答案在JDK8中已经过时。 这是自那时以来最好的方式:
private static final ThreadLocal> A_LIST = ThreadLocal.withInitial(ArrayList::new);