Threadsafe静态初始化ExecutorService

时间:2017-07-10 10:40:07

标签: java multithreading static executorservice

我正在尝试基于Initialization-on-demand holder习惯用法创建一个线程安全的单例类。这是我的代码

public class Check{ 
  private Check(){  }
  private static class Provider {
    static final ExecutorService INSTANCE = new ThreadPoolExecutor(5, "read this val from file", 60L, TimeUnit.SECONDS, new LinkedBlockingQueue());
  }
  public static ExecutorService getInstance() {
    return Provider.INSTANCE;
  }
}

我的期望是以线程安全的方式初始化ExecutorService,并且只有一个实例(静态)。

此代码是否实现了 - 或者是否需要进行任何更改?

2 个答案:

答案 0 :(得分:2)

根据SEI guidelines,您的方法很好。

但是因为我们有枚举,所以使用枚举的简单方法是:

public enum Service {
  INSTANCE;

  private final ExecutorService service = ...
  public getService() { return service ; }

如果你想要非常聪明,你还要定义一个enum实现的接口;因为这允许您稍后模拟该单例的用法。这对使用相同线程exectution服务替换编写单元测试非常有用。

答案 1 :(得分:0)

最简单的线程安全初始化是使用如下的静态final类变量:

public class Check {
  public static final Executor EXECUTOR = new ThreadPoolExecutor(5, "read this val from file", 60L, TimeUnit.SECONDS, new LinkedBlockingQueue());
  // ...
}

如果您喜欢这种风格,请添加一个Getter。

你正在尝试的是一个懒惰的初始化,最好用枚举(如GhostCat的答案)。但是对于您的用例,懒惰初始化不是必需的,因为执行器快速初始化并且占用空间小。