饿汉模式
/*
饿汉模式,加载字节码文件的时候创建对象
*/
public class Sigleton01 {
private static Sigleton01 instance = new Sigleton01();
private Sigleton01() {}
public static Sigleton01 getInstance() {
return instance;
}
}
懒汉模式
/*
懒汉模式
双重加锁检测模式
volatile可以防止多线程情况下cpu指令重排,避免获取到未实例化的对象
第一重加锁可以减少拥塞的线程数
第二重加锁保证只获取一个唯一的实例对象
*/
public class Sigleton02 {
private volatile static Sigleton02 instance = null;
private Sigleton02() {}
public static Sigleton02 getInstance() {
if (instance == null) {
synchronized(Sigleton02.class) {
if (instance == null) {
instance = new Sigleton02();
}
}
}
return instance;
}
}
/*
懒汉模式
静态内部类,调用方法时才将内部类的字节码加载到内存;
*/
public class Sigleton03 {
private Sigleton03() {}
private static class innerClass {
private static final Sigleton03 instance = new Sigleton03();
}
public static Sigleton03 getInstance() {
return innerClass.instance;
}
}
枚举模式
/*
枚举模式,最推荐,不仅可以解决多线程下的同步问题,自动支持序列化机制,绝对防止多次实例化。
是交给jvm来保证
*/
public enum Sigleton04 {
INSTANCE;
public Sigleton04 getInstance() {
return INSTANCE;
}
}