定义
通过将类构造方法私有化,仅通过静态方法作为全局访问点提供该类唯一的一个对象,即为单例模式。
单例模式属于创建型模式,需保证该类对象全局有且只有一个。
实现
饿汉式单例
即在类加载阶段就调用私有构造方法生成一个对象实例,再提供一个静态方法返回该实例引用,保证全局只会生成一个该类对象实例;
/**
* 单例模式
* 饿汉式,即在类加载时就调用私有构造方法生成对象实例
*/
public class Singleton {
//类加载时就调用私有构造方法生成对象实例
private static Singleton instance = new Singleton();
//构造方法私有化
private Singleton() {}
/**
* 需要对象实例调用getInstance静态方法即可
* @return instance
*/
public static Singleton getInstance() {
return instance;
}
}
懒汉式单例
即单例对象延迟加载,仅在首次获取时生成该对象实例,后续则直接使用该对象不再重新生成保证单例
/**
* 单例模式
* 懒汉式,即单例对象延迟加载,仅在首次获取时生成该对象实例,后续则直接使用该对象不再重新生成保证单例
*/
public class Singleton {
//通过volatile机制防止指令重排序,防止出现DCL失效问题
private volatile static Singleton instance;
//构造方法私有化
private Singleton() {}
/**
* 仅在首次获取时生成该对象实例,后续则直接使用该对象不再重新生成保证单例
* 需要双重检查加锁保证线程安全
* @return instance
*/
public static Singleton getInstance() {
//判断对象为空则尝试进入同步代码块争抢锁
if (instance == null) {
synchronized (Singleton.class) {
//获得锁后需要重新判空一次,否则极端情况下当前线程判空成功获得锁前,正好有其他线程生成对象实例释放锁,
//会导致前后两次调用getInstance方法生成不同实例,破坏单例,因此做双重检查加锁是必须的;
if (instance == null) {
instance = new Singleton();
}
}
}
return instance;
}
}
静态内部类式单例
/**
* 单例模式
* 静态内部类方式实现单例
*/
public class Singleton {
//构造方法私有化
private Singleton() {}
private static class SingletonHolder {
private static Singleton INSTANCE = new Singleton();
}
/**
* 线程安全,通过静态内部类保证单例
* @return
*/
public static Singleton getInstance() {
//getInstance方法首次调用时才会加载加载静态内部类SingletonHolder,从而生成对象实例实现懒加载
return SingletonHolder.INSTANCE;
}
}
枚举式单例
/**
* 单例模式
* 通过枚举实现单例
*/
public enum Singleton {
INSTANCE;
}