Java面试题设计模式篇单例模式

1 饿汉式-不要求延迟加载的情况下使用

饿汉方式一:Enum

public enum Singleton {  
    INSTANCE;  
    public void whateverMethod() {  
    }  
}

饿汉方式二:静态类变量

如果不需要延迟初始化,饿汉式可以接受,那么可以采用下面的简单方法实现:

  • 线程安全
  • 实现简单
  • 类加载时便初始化实例
  • instance为静态变量,利用静态变量实现单例模式
public class Singleton {  
    private static Singleton instance = new Singleton();  
    private Singleton (){}  
    public static Singleton getInstance() {  
    return instance;  
    }  
}

2 懒汉式-明确需要延迟加载情况下

如果不想提前初始化实例,直到使用的时候才初始化。那么采用懒汉式,相对复杂些。

懒汉方式一:静态内部类延迟特性

public class Singleton {  
    private static class SingletonHolder {  
    private static final Singleton INSTANCE = new Singleton();  
    }  
    private Singleton (){}  
    public static final Singleton getInstance() {  
    return SingletonHolder.INSTANCE;  
    }  
}
  • 静态内部类本身延迟加载,只有调用时才会初始化
  • instance变量依旧式利用类的静态变量保证单例实现,无法利用静态内部类实现延迟加载,

懒汉方式二:双重检查锁延迟初始化

public class Singleton {  
    private volatile static Singleton singleton;  
    private Singleton (){}  
    public static Singleton getSingleton() {  
    if (singleton == null) {  
        synchronized (Singleton.class) {  
        if (singleton == null) {  
            singleton = new Singleton();  
        }  
        }  
    }  
    return singleton;  
    }  
}

猜你喜欢

转载自blog.csdn.net/hanruikai/article/details/82426990