条件
1、 只能有一个实列
2、 实例为程序自行创建
3、 向整个系统提供这个实例
实现方式
1、饿汉模式
public class EagerTaskManager {
//饿汉模式,类加载时唯一实例会被创建
private static final EagerTaskManager taskManager = new EagerTaskManager();
private EagerTaskManager(){
}
public static EagerTaskManager getInstance() {
return taskManager;
}
}
2、懒汉模式
public class LazyTaskManager {
//懒汉单列,节省内存空间,使用时在创建单列对象
private static LazyTaskManager taskManager = null;
private LazyTaskManager() {
}
// 懒汉模式,为避免多个线程同时调用实列方法,使用同步锁
// 直接在方法上加synchronized解决线程问题,但每次调用该方法都需要同步锁判断,降低了效率
public static LazyTaskManager getInstance() {
if (taskManager == null) {
synchronized (LazyTaskManager.class) {
// 只对实列方法进行同步锁定即可,如果多个线程同时进入if分支,会产生新的实列,进行双重检查锁定
if (taskManager == null) {
taskManager = new LazyTaskManager();
}
}
}
return taskManager;
}
}
3、 IoDH
public class IoDHTaskManager {
// 单列对象没有作为成员变量,所以不会随着类加载而实例化
private IoDHTaskManager(){
}
private static class HolderClass {
private final static IoDHTaskManager taskManager = new IoDHTaskManager();
}
// 第一次调用该实例化方法,随之静态内部类的加载,实例化该单列对象
public static IoDHTaskManager getInstance() {
return HolderClass.taskManager;
}
}