设计模式(四)之 单例模式

2018-08-30  本文已影响9人  innovatorCL

一、定义

确保某个类只有一个实例,而且自行实例化并向整个系统提供这个实例。

单例模式

二、使用场景

三、栗子

1、懒汉式单例

/**
 * 懒汉式单例(用到才实例化)
 * 优点:Lazy 初始化;线程安全
 * 缺点:每次需要同步性能较低,不建议使用
 * @author innovator
 *
 */
public class MyLazySingleton {

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

2、饿汉式单例

/**
 * 饿汉式单例(加载类的时候已经实例化)
 * 优点:非Lazy 初始化
 * 缺点:浪费内存;线程安全,基于 ClassLoader 机制避免了多线程的同步问题
 * @author innovator
 */ 
public class MyStarveSingleton {

    
    //方式一:类装载的时候初始化
    private static MyStarveSingleton instance = new MyStarveSingleton();
    
    //方式二:类初始化的时候才去初始化
    static {
            instance = new MyStarveSingleton();
    }
    
    private MyStarveSingleton() {
        
    }
    
    public static MyStarveSingleton getInstance() {
        return instance;
    }
}

3、双检锁/双重校验锁单例(DCL,即 double-checked locking)

/**
 * DCL单例
 * 优点:懒汉式的改进版,Lazy初始化;线程安全,且在多线程情况下能保持高性能
 * @author innovator
 *
 */
public class MyDCLSingleton {

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

4、静态内部类单例

/**
 * 静态内部类单例
 * 确保调用 getInstance 才 Lazy 初始化;线程安全;推荐使用
 * @author innovator
 *
 */
public class MyInnerStaticSingleton {
    
    private MyInnerStaticSingleton() {
        
    }
    
    public static MyInnerStaticSingleton getInstance() {
        
        return SingletonHolder.instance;
    }
    
    public static class SingletonHolder{
        
        private static final MyInnerStaticSingleton instance = new MyInnerStaticSingleton();
    }
}

5、枚举型单例

/**
 * 枚举型单例
 * 优点:Lazy初始化;线程安全;是实现单例模式的最佳方法。它更简洁,自动支持序列化机制,绝对防止多次实例化。
 * @author innovator
 *
 */
public enum MyEnumSingleton {
    INSTANCE
}

四、优点

五、缺点

上一篇 下一篇

猜你喜欢

热点阅读