单列模式的N种实现方式
1.饿汉式(线程安全·可用)
public class Singleton {
private Singleton() {
}
private static Singleton sSingleton = new Singleton();
public static Singleton getInstance() {
return sSingleton;
}
}
2.常量式(线程安全,可用)
public class Singleton {
private Singleton() {
}
public static final Singleton sSingleton = new Singleton();
}
3.懒汉式(线程不安全,并发场景不可用)
public class Singleton {
private Singleton() {
}
private static Singleton sSingleton;
public static Singleton getInstance() {
if (sSingleton == null) {
sSingleton = new Singleton();
}
return sSingleton;
}
}
4.同步的懒汉式?(线程安全,可用,不建议使用)
public class Singleton {
private Singleton() {
}
private static Singleton sSingleton;
public synchronized static Singleton getInstance() {
if (sSingleton == null) {
sSingleton = new Singleton();
}
return sSingleton;
}
}
5.双重检查锁 DCL (线程安全,大多数场景满足需求,推荐使用)
public class Singleton {
private Singleton() {
}
private static volatile Singleton sSingleton;
public static Singleton getInstance() {
if (sSingleton == null) {
synchronized (Singleton.class) {
if (sSingleton == null) {
sSingleton = new Singleton();
}
}
}
return sSingleton;
}
}
6.静态内部类(线程安全,推荐使用)
public class Singleton {
private Singleton () {
}
private static class InnerClassSingl`在这里插入代码片`eton {
private final static Singleton sSingleton = new Singleton();
}
public static Singleton getInstance() {
return InnerClassSingleton.sSingleton;
}
}
7.枚举单例(线程安全,不建议使用)
public enum Singleton{
INSTANCE;
public void doSomething(){
...
}
}
8.另类实现——利用容器实现单例
import java.util.HashMap;
import java.util.Map;
public class Singleton {
private static Map<String, Object> objMap = new HashMap<String, Object>();
private Singleton() {
}
public static void registerService(String key, Object instance) {
if (!objMap.containsKey(key)) {
objMap.put(key, instance);
}
}
public static Object getService(String key) {
return objMap.get(key);
}
}