ExecutorService 的线程安全静态初始化
Threadsafe static initialization of ExecutorService
我正在尝试创建一个线程安全单例 class 基于 Initialization-on-demand holder 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 guidelines 你的方法很好。
但是因为我们有枚举,所以使用枚举的简单方法:
public enum Service {
INSTANCE;
private final ExecutorService service = ...
public getService() { return service ; }
如果你想变得非常聪明,你还可以定义一个枚举实现的接口;因为这允许您稍后 mock 使用该单例。这对于使用相同线程执行服务替换编写单元测试非常有帮助。
最简单的线程安全初始化是使用静态最终 class 变量,如下所示:
public class Check {
public static final Executor EXECUTOR = new ThreadPoolExecutor(5, "read this val from file", 60L, TimeUnit.SECONDS, new LinkedBlockingQueue());
// ...
}
如果您喜欢那种风格,请添加 Getter。
您正在尝试的是惰性初始化,最好使用枚举完成(如 GhostCat 的回答)。但是对于您的用例,延迟初始化不是必需的,因为执行程序初始化速度快且占用空间小。
我正在尝试创建一个线程安全单例 class 基于 Initialization-on-demand holder 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 guidelines 你的方法很好。
但是因为我们有枚举,所以使用枚举的简单方法:
public enum Service {
INSTANCE;
private final ExecutorService service = ...
public getService() { return service ; }
如果你想变得非常聪明,你还可以定义一个枚举实现的接口;因为这允许您稍后 mock 使用该单例。这对于使用相同线程执行服务替换编写单元测试非常有帮助。
最简单的线程安全初始化是使用静态最终 class 变量,如下所示:
public class Check {
public static final Executor EXECUTOR = new ThreadPoolExecutor(5, "read this val from file", 60L, TimeUnit.SECONDS, new LinkedBlockingQueue());
// ...
}
如果您喜欢那种风格,请添加 Getter。
您正在尝试的是惰性初始化,最好使用枚举完成(如 GhostCat 的回答)。但是对于您的用例,延迟初始化不是必需的,因为执行程序初始化速度快且占用空间小。