1:单例模式
public class Singleton {
private static Singleton singleton = null;
private Singleton(){
}
public static Singleton getSingleton(){
if (singleton == null){
return new Singleton();
}
return singleton;
}
}
注意:多线程模式下可能会创建出多个实例
2:多线程单例模式:
public class Singleton {
private static Singleton singleton = null;
private Singleton(){
}
public static Singleton getSingleton(){
synchronized (Singleton.class){
if (singleton == null){
return new Singleton();
}
return singleton;
}
}
}
注意:每次调用getSingleton方法都需要加锁,不管Singleton类是否初始化过
3.双重锁检验
public class Singleton {
private static Singleton singleton = null;
private Singleton(){
}
public static Singleton getSingleton(){
if (singleton == null){
synchronized (Singleton.class){
if(singleton == null){
return new Singleton();
}
}
}
return new Singleton();
}
}
注意:可以通过构造器的setAccessible方法通过反射方式调用私有的构造器方法,安全性能低
4.枚举单例
public enum EnumSingleton {
INSTANCE;
public EnumSingleton getInstance(){
return INSTANCE;
}
}