Java单例模式

在网上看的单例模式的几种实现,自己手写了下例子,贴出来留着以后复习用

1.饿汉式

/**
 * @CopyRight: 版权所有
 * @Description: 饿汉式的特点:线程安全,调用效率高,但是不能延时加载
 * @Date: Created in 2019/8/26 11:54
 */
public class HungryManSingleton {

    /**
     * 单例模式需要满足的三个条件
     * 构造函数私有化;
     * 自行创建唯一实例,并向用户公布返回该实例的接口;
     * 定义一个唯一对象。
     */

    /**
     * 实例化这个类
     */
    private static final HungryManSingleton INSTANCE = new HungryManSingleton();


    /**
     * 私有构造方法
     */
    private HungryManSingleton() {

    }

    /**
     * 对外提供公开静态方法返回唯一实例
     *
     * @return 实例对象
     */
    public static HungryManSingleton getIntance() {
        return INSTANCE;
    }
}

2.懒汉式

/**
 * @CopyRight: 版权所有
 * @Description: 懒汉式的特点:线程安全,调用效率不高,但是能延时加载;
 * @Date: Created in 2019/8/26 12:18
 */
public class SluggardSingleton {

    /**
     * 类初始化时,不初始化这个对象(懒加载真正用的时候采取加载)
     */
    private static SluggardSingleton instance;

    /**
     * 私有构造函数
     */
    private SluggardSingleton() {

    }

    /**
     * 创建静态方法让外部可以获取实例
     * 方法同步调用效率低
     *
     * @return 实例
     */
    public static synchronized SluggardSingleton getInstance() {
        if (instance == null) {
            instance = new SluggardSingleton();
        }
        return instance;
    }


}

3.双重检查锁

/**
 * @CopyRight: 版权所有
 * @Description: Double CheckLock也就是双重锁判断机制(由于JVM底层模型原因,偶尔会出问题,不建议使用),是在懒汉式单例上发展而来
 * @Date: Created in 2019/8/26 12:29
 */
public class DoubleCheckLockSingleton {

    /**
     * volatile:作用其它线程可见,当instance改变其它线程可以立即看见,不用去等锁释放增加了效率
     * 类初始化时,不初始化这个对象(懒加载真正用的时候采取加载)
     */
    private static volatile DoubleCheckLockSingleton instance;


    /**
     * 私有构造函数
     */
    private DoubleCheckLockSingleton() {

    }

    /**
     * 静态方法
     * 双重锁判断机制
     *
     * @return .
     */
    public static DoubleCheckLockSingleton getInstance() {
        if (instance == null) {
            synchronized (DoubleCheckLockSingleton.class) {
                if (instance == null) {
                    instance = new DoubleCheckLockSingleton();
                }
            }
        }
        return instance;
    }


}

4.静态内部类

/**
 * @CopyRight: 版权所有
 * @Description: 静态内部类,静态内部类模式的特点:线程安全,调用效率高,可以延时加载;
 * @Date: Created in 2019/8/26 12:39
 */
public class StaticInnerClassSingleton {

    /**
     * 静态内部类
     */
    private static class InnerClass {
        private static final StaticInnerClassSingleton INSTANCE = new StaticInnerClassSingleton();
    }

    /**
     * 私有构造函数
     */
    private StaticInnerClassSingleton() {

    }

    /**
     * 静态方法
     *
     * @return .
     */
    public static StaticInnerClassSingleton getInstance() {
        return InnerClass.INSTANCE;
    }
}

5.枚举类

/**
 * @CopyRight: 版权所有
 * @Description: 枚举类,枚举类特点:线程安全,调用效率高,不能延时加载,可以天然的防止反射和反序列化调用;
 * @Date: Created in 2019/8/26 13:30
 */
public class EnumSingleton {

    /**
     * 单例对象占用资源少,不需要延时加载时:枚举好于饿汉 ;
     * 单例对象占用资源多,需要延时加载时:静态内部类 好于 懒汉式。
     */

    /**
     * 枚举
     */
    private enum Singleton {
        INSTANCE;

        private EnumSingleton instance;

        public EnumSingleton getInstance() {
            return instance;
        }

        private Singleton() {
            instance = new EnumSingleton();
        }
    }


    /**
     * 私有构造函数
     */
    private EnumSingleton() {

    }

    /**
     * 静态方法
     *
     * @return .
     */
    public static EnumSingleton getInstance() {
        return Singleton.INSTANCE.getInstance();
    }

}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值