单例模式


1. 类图

image.png

Singleton:负责创建Singleton类自己的唯一实例,并提供一个getInstance的方法,让外部来访问这个类的唯一实例

2. 示例

2.1 懒汉式单例

/**
 * 饿汉式单例:初始化时直接创建
 */
public class HungrySingleton {
    private static HungrySingleton hungrySingleton = new HungrySingleton();

    private HungrySingleton(){}

    public static HungrySingleton getInstance(){
        return hungrySingleton;
    }
}

2.2 饿汉式单例

/**
 * 懒汉式单例:调用时创建
 */
public class LazySingleton {
    private static LazySingleton lazySingleton = null;

    private LazySingleton(){}

    public static LazySingleton getInstance(){
        if (lazySingleton == null) {
            lazySingleton = new LazySingleton();
        }
        return lazySingleton;
    }
}

2.3 双检锁

/**
 * 双检锁单例:volatile可能会屏蔽掉虚拟机中一些必要的代码优化,运行效率不是很高
 */
public class DoubleCheckSingleton {
    private volatile static DoubleCheckSingleton doubleCheckSingleton = null;

    private DoubleCheckSingleton(){}

    public static DoubleCheckSingleton getInstance(){
        if (doubleCheckSingleton == null) {
            synchronized (DoubleCheckSingleton.class){
                if (doubleCheckSingleton == null) {
                    doubleCheckSingleton = new DoubleCheckSingleton();
                }
            }
        }
        return doubleCheckSingleton;
    }
}

2.4 静态内部类

/**
 * 静态内部类
 */
public class StaticInnerSingleton {
    private StaticInnerSingleton(){}

     // 类级的内部类,该内部类的实例与外部类的实例无绑定关系,且只有在被调用时才会装载,从而实现延迟加载
    private static class SingletonHolder{
        // 静态初始化器,由JVM来保证线程安全
        private static StaticInnerSingleton staticInnerSingleton = new StaticInnerSingleton();
    }

    public static StaticInnerSingleton getInstance(){
        return SingletonHolder.staticInnerSingleton;
    }
}

2.5 枚举

/**
 * 枚举单例:无偿提供了序列化机制,防止多次实例化
 */
public enum EnumSingelton {
    uniqueInstance;

    public void singletonOperation(){
        // 功能处理
    }
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值