ExecutorService 的线程安全静态初始化



我正在尝试创建一个基于按需初始化持有者习语的线程安全单例类。这是我的代码

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 ; }

如果你想变得非常聪明,你也可以定义一个枚举实现的接口;因为这允许你以后模拟该单例的用法。这对于使用相同的线程执行服务替换编写单元测试非常有用。

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

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

如果您喜欢该样式,请添加 Getter。

您正在尝试的是延迟初始化,最好使用枚举来完成(如 GhostCat 的答案(。但是对于您的用例,延迟初始化不是必需的,因为执行器初始化速度快且占用空间小。

最新更新