我正在尝试基于 Initialization-on-demandholder idiom 创建一个线程安全的单例类。这是我的代码
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 ; }
如果你想变得真正聪明,你还可以定义一个枚举实现的接口;因为这可以让你以后mock该单例的用法。这对于使用相同线程执行服务替换来编写单元测试非常有帮助。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)