美文网首页
单例模式 Singleton

单例模式 Singleton

作者: sickle4j | 来源:发表于2019-03-18 12:45 被阅读0次

单例模式主要是为了尽可能的节约内存空间,减少无谓的GC消耗,并且使应用可以正常运作。

如果一个类,在应用中如果有两个或者两个以上的实例会引起错误,又或者说,就是这些类,在整个应用中,同一时刻,有且只能有一种状态,在这种情况下就非常适合使用单例模式。

下面是我总结的各种单例模式的例子:
懒汉式:


public class LazySingleton {

    //懒汉模式在请求时创建实例

    private static LazySingleton lazySingleton = null;

    private LazySingleton() {

}

    public static LazySingleton getInstance() {

        if (lazySingleton == null) {

            lazySingleton = new LazySingleton();

        }

        return lazySingleton;

    }

}

饿汉式:

public class EagerSingleton {
    /**
     * @Description: 在类被加载时已经创建实例,而且不会出现同步问题
     * @Author: sickle
     * @Date: 2019/3/18
     */
    private static final EagerSingleton INSTANCE = new EagerSingleton();

    private EagerSingleton() {

    }

    public static EagerSingleton getInstance() {
        return INSTANCE;
    }
}

同步单例:

public class SynchronizedSingleton {
    //一个静态的实例
    private static SynchronizedSingleton instance;
    //私有化构造函数
    private SynchronizedSingleton(){}
    //给出一个公共的静态方法返回一个单一实例
    public synchronized static SynchronizedSingleton getInstance(){
        if (instance == null) {
            instance = new SynchronizedSingleton();
        }
        return instance;
    }
}

双重检测

public class DoubleLockSingleton {
    //一个静态的实例
    private static DoubleLockSingleton instance;

    //私有化构造函数
    private DoubleLockSingleton() {
    }

    //给出一个公共的静态方法返回一个单一实例
    public static DoubleLockSingleton getInstance() {
        if (instance == null) {
            synchronized (SynchronizedSingleton.class) {
                if (instance == null) {
                    instance = new DoubleLockSingleton();
                }
            }
        }
        return instance;
    }
}

比较推荐的单例模式

public class Singleton {
    //只有在调用getInstance方法是才会创建实例,并且由jvm保证只有一个被创建

    private Singleton() {
    }

    public static Singleton getInstance() {
        return SingletonInstance.instance;
    }

    private static class SingletonInstance {

        static Singleton instance = new Singleton();

    }
}

还有一些静态代码块之类的单例写法就不写了,如有不当之处,请予指正

相关文章

网友评论

      本文标题:单例模式 Singleton

      本文链接:https://www.haomeiwen.com/subject/amrvmqtx.html