一.
/** * @Name T00 * @Description 懒汉模式(线程安全,无法懒加载) */ public class T00 { private final static T01 t01 = new T00(); private T00(){ //构造函数私有化,防止直接调用实例对象 } public static T00 getInstace(){ return t00; } }
二.
/** * @Name T01 * @Description 懒汉模式二(线程安全,无法懒加载,可以在static代码块加载一些方法或配置) */ public class T01 { private final static T01 t01; static { //do some thing t= new T01(); } private T01(){ //构造函数私有化,防止直接调用实例对象 } public static T01 getInstace(){ return T01.t01; } }
三.
3-1.
/** * @Name T02 * @Description 饿汉模式(线程不安全) */ public class T02 { private static T02 t02; private T02(){ //构造函数私有化,防止直接调用实例对象 } public static T02 getInstace(){ if(t02 == null){ t02 = new T02(); } return t02; } }
3-2.
/** * @Name T03 * @Description 饿汉模式(线程安全,效率不高) */ public class T03 { private static T03 t03; private T03(){ //构造函数私有化,防止直接调用实例对象 } public synchronized static T03 getInstace(){ if(t03 == null){ t03 = new T03(); } return t03; } }
四.
4-1.
/** * @Name T04 * @Description 饿汉模式(线程安全,效率比T03高, * 但jvm虚拟机重排序(jvm编译或运行时为提高代码执行效率会使代码重排序),可能会出现线程安全问题 */ public class T04 { private static T04 t04; private T04(){ //构造函数私有化,防止直接调用实例对象 } public static T04 getInstace(){ if(t04 == null){ synchronized(T04.class){ if(null == t04) { t04 = new T04(); } } } return t04; } }
4-2.
/** * @Name T04_1 * @Description 饿汉模式(线程安全,效率比T03高) * 加入 volatile 关键字,阻止jvm重排序,但影响效率 * * 补充;1.volatile关键字作用: * 1.使(java内存模型)内存可见, * 2.阻止jvm虚拟机对代码重排序 */ public class T04_1 { private volatile static T04_1 t04; private T04_1(){ //构造函数私有化,防止直接调用实例对象 } public static T04_1 getInstace(){ if(t04 == null){ synchronized(T04_1.class){ if(null == t04) { t04 = new T04_1(); } } } return t04; } }
五.
/** * @Name T05 * @Description 内部类(线程安全,可以懒加载) */ public class T05 { private T05(){ //构造函数私有化,防止直接调用实例对象 } private static class Singleton{ public static final T05 t05 = new T05(); } public static T05 getInstace(){ return Singleton.t05; } }
六.
/** * @Name T06 * @Description 内部枚举(线程安全,可以懒加载,从底层防止了反序列化破解的可能) */ public class T06 { private T06(){ //构造函数私有化,防止直接调用实例对象 } private enum Singleton{ INSTANCE; private final T06 t06; Singleton(){ t06 = new T06(); } } public static T06 getInstace(){ return Singleton.INSTANCE.t06; } }