1.饿汉式(静态代码块)
public static class Singleton {
private Singleton(){}
public static Singleton instance;
static{
instance=new Singleton();
}
public static Singleton getInstance(){
return instance;
}
}
}
优点:
将类实例化的过程装在了静态代码块中,类装载的时候完成实例化,避免了线程同步问题
缺点:
在类加载的时候就完成实例化,没有达到懒加载的效果,如果从始至终没有使用这个实例,会造成内存的浪费
2.懒汉式(双重检查)
public static class Singleton {
private Singleton(){}
public static volatile Singleton instance;
public static Singleton getInstance(){
if(instance==null){
synchronized (Singleton.class){
if(instance==null){
instance = new Singleton();
}
}
}
return instance;
}
}
}
进行了两次检查,可以保证线程安全。实例化代码只执行一次,可以起到延迟加载的作用,效率很高,实际开发中推荐使用
3.静态内部类
public static class Singleton {
private Singleton(){}
private static class singletonHolder{
private final static Singleton instance=new Singleton();
}
public static Singleton getInstance(){
return singletonHolder.instance;
}
}
}
使用了类装载的机制保证初始化实例的时候只有一个进程。类的静态属性只会在类第一次加载时初始化,在这里JVM帮我们保证了线程的安全性,在类进行初始化时,别的类无法进入,推荐使用
4.枚举类
public enum Singleton {
instance;
public void method(){}
}
}
能解决多线程同步问题,而且能防止反序列化重新创建新对象,推荐使用