单例模式
饿汉
public class ApplicationContext {
private static final ApplicationContext INSTANT = new ApplicationContext();
private ApplicationContext() {
init();
}
public static getInstant() {
return INSTANT;
}
}
懒加载
public class ApplicationContext {
private static volatile final ApplicationContext INSTANT = null; // volatile 防止重排序
private ApplicationContext() {
init();
}
public static getInstant() {
if (INSTANT == null) { // 一重检查
synchronized(ApplicationContext.class) {
if (INSTANT == null) { // 二重检查
INSTANT = new ApplicationContext();
}
}
}
return INSTANT;
}
}
静态类
public class ApplicationContext {
private ApplicationContext() {
init();
}
public static getInstant() {
return Builder.INSTANT;
}
// 防止序列化攻击
private Object readResolve() {
return Builder.INSTANT;
}
private static class Builder {
private static final ApplicationContext INSTANT = new ApplicationContext();
}
}
枚举类
枚举类的单例可以防止序列化攻击,而静态类的单例需要重写readResolve方法
public enum Singleton {
INSTANCE;
public void doSomething() {
System.out.println("doSomething");
}
}
线程池单例
public enum ApplicationEnum {
INSTANT;
ApplicationEnum() {
executor = new ScheduledThreadPoolExecutor(10, new ScheduleThreadFactory
.Builder()
.namingPattern("ScheduledManager线程:%d")
.uncaughtExceptionHandler((t, e) -> {
e.printStackTrace();
})
.build());
}
private final ScheduledThreadPoolExecutor executor;
public void executeTask(Runnable task, int time, TimeUnit unit) {
executor.schedule(task, time, unit);
}
}