Java 单例模式的七种写法

Java 单例模式的七种写法-LMLPHP

Java 单例模式的七种写法-LMLPHP

第一种(懒汉,线程不安全)

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

第二种(懒汉,线程安全)

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

第三种(饿汉)

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

第四种(饿汉,变种)

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

第五种(静态内部类)

public class Singleton {
private static final class SingletonHolder {
private static final Singleton INSTANCE = new Singleton();
} private Singleton() {
} public static Singleton getInstance() {
return SingletonHolder.INSTANCE;
}
}

第六种(枚举)

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

第七种(双重校验锁)

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

两个问题总结

  • 对第一个问题修复的办法是
private static Class getClass(String classname) throws ClassNotFoundException {
ClassLoader classLoader = Thread.currentThread().getContextClassLoader(); if (classLoader == null)
classLoader = Singleton.class.getClassLoader(); return (classLoader.loadClass(classname));
}
  • 对第二个问题修复的办法是
public class Singleton implements java.io.Serializable {
public static Singleton INSTANCE = new Singleton(); protected Singleton() {
} private Object readResolve() {
return INSTANCE;
}
}

参考资料

04-30 12:19