单例模式

定义:确保一个类只有一个实例,并提供一个全局访问点。

类图

实现方式

懒加载:线程安全,调用getInstance时才加载,节省内存,缺点是性能较差,同步几乎只在第一次创建对象时需要。

public class Singleton {
    private static Singleton instance;
    private Singleton(){}
    public static synchronized Singleton getInstance(){
        if(instance==null){
            instance = new Singleton();
        }
        return instance;
    }
}

急切加载:系统加载时就创建实例,保证线程安全,浪费内存。

public class Singleton {
    private static Singleton instance = new Singleton();

    private Singleton() {}

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

双重加锁:懒加载的同时保持性能,不使用JDK5以前的版本,实现相对复杂。

public class Singleton {
    private static volatile Singleton instance;//volatile 保证多线程能正确处理instance变量

    private Singleton() {
    }

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

利用静态块懒加载:效果类似双重加锁,实现简单一些

public class Singleton {
    private static class SingletonHolder {
        private static final Singleton INSTANCE = new Singleton();
    }

    private Singleton() {
    }

    public static final Singleton getInstance() {
        return SingletonHolder.INSTANCE;
    }
}

枚举模式 :自带序列化机制,绝对防止多次实例化,即使面对复杂的序列化或者反射攻击的时候。经常作为实现单例的最佳方法。不适合需要单例必须扩展超类的情况(参考 《Effective Java》)

public enum SingletonEnum {
    INSTANCE;
    void someMethod(){
        System.out.println("这里是单例对象的方法!");
    }
}
posted @ 2020-02-24 10:52  Camcay  阅读(112)  评论(0)    收藏  举报