LillianEom
8/23/2018 - 2:53 AM

单例模式

// 经典的单件模式
public class Singleton {
    private static Singleton uniqueInstance;    // Singleton类的唯一实例

    // 私有的构造器,只有该类内部可以调用
    private Singleton() {}
    
    // 唯一实例的全局访问点
    public static Singleton getInstance() {
        if(uniqueInstance == null) {
            // 单件可以延迟实例化,对资源敏感的对象特别重要
            uniqueInstance = new Singleton();   
        }
        return uniqueInstance;
    }
}

// 多线程下的单件模式
// 1. getInstance()的性能对应用程序影响不大:直接用synchronized关键字修饰getInstance()
public class Singleton {
    private static Singleton uniqueInstance;    // Singleton类的唯一实例
    
    // 私有的构造器,只有该类内部可以调用
    private Singleton() {}

    // 唯一实例的全局访问点
    public static synchronized Singleton getInstance() {
        if(uniqueInstance == null) {
            // 单件可以延迟实例化,对资源敏感的对象特别重要
            uniqueInstance = new Singleton();
        }
        return uniqueInstance;
    }
}

// 2. 应用程序总是创建单件实例/创建实例的负担不重:在静态初始化器中创建单件
public class Singleton {
    private static Singleton uniqueInstance = new Singleton();    // Singleton类的唯一实例

    // 私有的构造器,只有该类内部可以调用
    private Singleton() {}

    // 唯一实例的全局访问点
    public static Singleton getInstance() {
        return uniqueInstance;
    }
}

// 3. 可以使用Java 1.5及以上版本:双重检查加锁(只有第一次会同步)
public class Singleton {
    private volatile static Singleton uniqueInstance;    // Singleton类的唯一实例

    // 私有的构造器,只有该类内部可以调用
    private Singleton() {}

    // 唯一实例的全局访问点
    public static Singleton getInstance() {
        if(uniqueInstance == null) {
            synchronized (Singleton.class) {
                if(uniqueInstance == null) {
                    uniqueInstance = new Singleton();
                }
            }            
        }
        return uniqueInstance;
    }
}