1,饿汉式
public class Singleton1{
private static Singleton1 instance = new Singleton1();
private Singleton1();
public static Singleton1 getInstance(){
return instance;
}}
线程安全,调用效率高,无法延时加载
缺点:单例还没有使用时,就已经初始化,会造成资源浪费。
2,懒汉式
public class Singleton2{
private static Singleton2 instance = null;
private Singleton2();
public static synchronized getInstance()
{
if(instance == null){
instance = new Singleton2();
}
return instance;
}
}
线程安全,调用效率低,可以延时加载。
总结:静态内部类调用的方式最优。
缺点:getInstance()方法加锁,只能同步调用,调用效率低。
3,双重锁判断机制
public class Singleton3{
private static Singleton3 instance = null;
private Singleton3();
public static Singleton3 getInstance(){
if(instance == null){
synchronized(Singleton3.class){
if(instance == null){
instance = new Singleton3();
}
}
}
return instance;
}
}
存在问题:由于new 对象无法保证原子性,可能会出现空指针异常。
4,静态内部类调用
public class Singleton4{
private static class Singletoninner{
private static final Singleton4 instance = new Singleton4();
}
private Singleton4();
public static Singleton4 getInstance(){
return Singletoninner.instance;
}
}
线程安全,调用效率高,可以延时加载。