饿汉式
public class Singleton {
private static final Singleton instance = new Singleton();
private Singleton() {} //私有化构造函数,防止new对象
public static Singleton getInstance() {
return intance;
}
}
懒汉式
public class Singleton {
private static Singleton instance = null;
private Singleton() {}
public static Singleton getInstance() {
if (instace == null) {
intance = new Singleton();
}
return intance;
}
}
Double Check Lock模式
这种模式为了线程安全需要双重检查,第二层检查的目的是防止一种情况出现:假设有A线程进到同步代码块里面,但还没执行完intance = new Singleton(); 此时intance为null,如果这时B线程获取单例会走到synchronize这里,因为同步的原因B线程会阻塞等待,当A线程执行完后intance已经指向一个Singleton对象了,这时B线程进入到同步代码块,如果不加第二个条件,B线程又会创建一个新对象,这就不符合单例的原则了。
public class Singleton {
private static Singleton instance == null;
private Singleton() {}
public static Singleton getInstance() {
if (instace == null) {
synchronize(Singleton.class) {
if (instace == null) {
intance = new Singleton();
}
}
}
return intance;
}
}
静态内部类模式
推荐使用此方法实现单例。当第一次调用getInstance()方法时,虚拟化会加载SingletonHolder类,因为它是静态内部类可以保证内部对象的唯一,并且线程安全
public class Singleton {
private Singleton() {}
public static Singleton getInstance() {
return SingletonHolder.intance;
}
private static class SingletonHolder {
private static final Singleton instance = new Singleton();
}
}
使用容器实现单例
我们使用HashMap来存储需要的单例类型,在程序开始调用registerService来注册各种单例类型,当我们需要单例对象时使用getIntance()从HashMap中获取单例类型
public class SingleManager {
private static Map<String, Object> singleMap = new HaspMap<>();
private SingleManager(){}
public static void registerService(String key, Object obj){
if (!singleMap.containsKey(key))
singleMap.put(key, obj);
}
public static object getIntance(String key) {
return singleMap.get(key);
}
}