单例模式实现的三种方式

单例模式(Singleton)
Singleton模式的要点在于一个类型只能被用来生成一个对象,且不能复制。必须要满足:
(1) 构造,拷贝和析构函数都是private,所以,无法通过声明对象来构造,
(2) 需要用静态成员变量来控制对象的个数,以保证不重复定义,
(3) 需要有静态的“构造”函数和“析构”函数。Singleton模式有两种方式:懒汉模式和饿汉模式。
菜鸟|单例模式

方法一(懒汉模式:即第一次调用该类实例的时候才产生一个新的该类实例,并在以后仅返回此实例):需要用锁,来保证其线程安全性:原因:多个线程可能进入判断是否已经存在实例的if语句,从而non thread safety.使用double-check来保证thread safety.但是如果处理大量数据时,该锁才成为严重的性能瓶颈。
以下是Java实现:

public class Singleton {

    private static volatile Singleton singleton;

    private Singleton() {}

    public static Singleton getInstance() {
        if (singleton == null) { //第一次判断
            synchronized (Singleton.class) {  //加所
                if (singleton == null) {  //第二次判断
                    singleton = new Singleton();
                }
            }
        }
        return singleton;
    }
}

方法二(饿汉模式:即无论是否调用该类的实例,在程序开始时就会产生一个该类的实例,并在以后仅返回此实例。):由静态初始化实例保证其线程安全性,因为静态实例初始化在程序开始时进入主函数之前就由主线程以单线程方式完成了初始化,不必担心多线程问题。故在性能需求较高时,应使用这种模式,避免频繁的锁争夺。
以下是Java实现:

public class Singleton {

    private static Singleton singleton;

    static {
        instance = new Singleton();
    }

    private Singleton() {}

    public Singleton getInstance() {
        return singleton;
    }
}

方法三(静态内部类单例)静态内部类的方式效果类似双检锁,但实现更简单。但这种方式只适用于静态域的情况,双检锁方式可在实例域需要延迟初始化时使用。
静态内部类在外部类加载的时候不会被加载,只有外部类中用到内部类时候才会被加载。 由于静态内部类没有使用任何锁机制,所以性能优于双重检查实现方式。

public class Singleton {
    private Singleton() {}

    private static Singleton getInstance() {

    }

    public static class Innerclasses {
        private ststic final Singleton singleton = new Singleton();
    };

};
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值