SIngleton 单例模式

2018-09-27  本文已影响0人  rommy020

单例模式(Singleton)
也叫单子模式,是一种常用的软件设计模式。在应用这个模式时,单例对象的类必须保证只有一个实例存在。许多时候整个系统只需要拥有一个的全局对象,这样有利于我们协调系统整体的行为。比如在某个服务器程序中,该服务器的配置信息存放在一个文件中,这些配置数据由一个单例对象统一读取,然后服务进程中的其他对象再通过这个单例对象获取这些配置信息。这种方式简化了在复杂环境下的配置管理。

一般通过 {className}.getInstance()来获得.

1: 饿汉式

特点: 线程安全,调用效率高,但是不能延时加载

public class Singleton {
    private Singleton() {
    }

    private static Singleton singleton = new Singleton();

    public static Singleton getInstance(){
        return singleton;
    }
    
    //...other function
}

2: 懒汉式

特点: 线程安全, 调用效率不高, 可以延长加载.

public class Singleton {
    private static Singleton singleton = null;

    private Singleton() {
    }
    
    //注意, 这里一定要用synchronized保证线程安全
    synchronized public static Singleton getInstance(){
        if( null == singleton )
            singleton = new Singleton();

        return singleton;
    }

    //...other function
}

3: 懒汉式--双重检查

特点: 线程安全, 调用效率高, 可以延长加载.

方法2中的性能不够好. 可以做如下的改进, volatile关键字的重要作用是禁止指令重排序, 保证内存不会出现内存分配, 返回对象引用, 初始化这样的错序.
下面的代码即为饿汉式的双重检查.

public class Singleton {
    private Singleton(){}

    private volatile static Singleton singleton = null;

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

        return singleton;
    }
}

4: 枚举

特点: 线程安全, 调用效率高, 不能延长加载, 代码精简

public enum Singleton {
    INSTANCE;
}
上一篇下一篇

猜你喜欢

热点阅读