我试图基于初始化按需持有人习惯用法创建一个线程安全的单例类。这是我的代码
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,并且那里只有一个实例(静态)。
这段代码是实现了这一目标-还是需要任何更改?
根据SEI 指南,您的方法很好。
但是,由于我们有枚举,因此可以使用枚举的简单方法:
public enum Service { INSTANCE; private final ExecutorService service = ... public getService() { return service ; }
而且,如果您想变得真正聪明,还可以定义枚举实现的接口。因为这样您以后可以 模拟 该单例的用法。这对于使用相同线程执行服务替换编写单元测试非常有帮助。