ThreadLocal供应商?

mst*_*rom 7 java java-8

如果我需要一个变量的ThreadLocal,是否还需要使用Supplier(也是线程安全的)?

例如,供应商在这里不需要完成线程安全吗?

private ThreadLocal<Supplier<MyClass>> myObject = new ThreadLocal<Supplier<MyClass>>();
Run Code Online (Sandbox Code Playgroud)

谢谢.

Sbo*_*odd 14

您的问题没有显示将供应商与ThreadLocal一起使用的典型方法.如果你想要一个MyClass的ThreadLocal,那么旧的(1.8之前的)方法通常是:

ThreadLocal<MyClass> local = new ThreadLocal<MyClass>();

// later
if (local.get() == null) {
  local.put(new MyClass());
}
MyClass myClass = local.get();
Run Code Online (Sandbox Code Playgroud)

另一种方法是delcare一个子类ThreadLocal,覆盖该initialValue方法.

在1.8中,您可以使用Supplier来处理初始化:

ThreadLocal<MyClass> local = ThreadLocal.withInitial(() -> new MyClass());
Run Code Online (Sandbox Code Playgroud)

从功能上讲,这两者基本相同,但供应商版本的代码要少得多.

  • 你可以用`MyClass :: new`替换`() - > new MyClass()`来写得更短. (2认同)