单例模式的实现

实现过程中需要考虑线程安全

1. 使用同步

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

2. 使用静态内部类

public class Singleton{
    private Singleton(){}

    private static class SingletonIns{
        private static Singleton instance = new Singleton();
    }
    public Singleton getInstance(){
        return SingletonIns.instance;
    }
}

  实现懒加载:虚拟机加载机制介绍了触发类初始化的时机,其中一项是读取或设置一个类型的静态字段时触发该类加载,即 getInstance() 方法中的 return SingletonIns.instance ,调用这个方法才会触发类加载。

  实现单例:JVM保证类的<clinit>()方法在多线程下会被正确的加锁,而初始化方法,就是对静态变量的赋值和静态语句块中的语句,这里就是 instance = new Singleton() 这个操作。

3. 使用枚举类

public class Singleton{}

public enum SingletonEnum{
    INSTANCE;
    private Singleton instance;
    private SingletonEnum() {
        instance = new Singleton();
    }
    public Singleton getInstance() {
      return instance;
    }
}

 

posted @ 2018-08-07 16:10  walker993  阅读(102)  评论(0编辑  收藏  举报