小编典典

ExecutorService的线程安全静态初始化

java

我试图基于初始化按需持有人习惯用法创建一个线程安全的单例类。这是我的代码

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,并且那里只有一个实例(静态)。

这段代码是实现了这一目标-还是需要任何更改?


阅读 503

收藏
2020-11-26

共1个答案

小编典典

根据SEI
指南,您的方法很好。

但是,由于我们有枚举,因此可以使用枚举的简单方法:

public enum Service {
  INSTANCE;

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

而且,如果您想变得真正聪明,还可以定义枚举实现的接口。因为这样您以后可以 模拟 该单例的用法。这对于使用相同线程执行服务替换编写单元测试非常有帮助。

2020-11-26