单例模式特性是只初始化一次,同时考虑满足懒加载的需要,以及满足多线程访问的安全性。在实际的生产使用中,比如像数据库连接,或者其他比较耗时同时需要只初始化一次的实例,都应该采用单例模式来创建。以下是两种比较特殊的单例模式,分别通过静态内部类和枚举来实现,满足只初始化一次,懒加载,多线程安全访问三个特性。其中多线程安全不额外加锁。
//枚举
public enum SingletonEnum {
INSTANCE;
private Map map = null;//other like db connections and so on,使用map来模拟
SingletonEnum() {
map = new HashMap<>();
}
public Map getInstance() {
return map;
}
public static void main(String[] args) {
Map m1 = SingletonEnum.INSTANCE.getInstance();
Map m2 = SingletonEnum.INSTANCE.getInstance();
System.out.println(m1 == m2);
}
}
//静态内部类
public class Singleton {
private String name;
private Singleton() {
name = "singleton";
}
public static Singleton getInstance() {
return Holder.inst;
}
public String getName() {
return name;
}
private static class Holder {
private static final Singleton inst = new Singleton();
}
public static void main(String[] args) {
Singleton s1 = Singleton.getInstance();
Singleton s2 = Singleton.getInstance();
System.out.println(s1 == s2);
}
}
网友评论