1,volatile+double-click方式
package com.wayne.singleDesigPattern;
public final class DoubleClick {
private byte[] data = new byte[1024];
/**
* 加volatile修饰主要目的:
* 避免JVM在运行是指令可能存在重新排序的问题。
* 若没有修饰,当私有构造器中,有其他成员变量需要初始化时,有可能造成构造器被实例化,而其他成员没有完成实例化,
* 从而造成其他成员变量空指针异常。
* 因为volatile保证了可见性和顺序性
*/
private volatile static DoubleClick instance = null;
private DoubleClick(){}
public static DoubleClick getInstance(){
if(null == instance){//避免每次都进入同步方法,提高效率
synchronized (DoubleClick.class){
if(null == instance){
instance = new DoubleClick();
}
}
}
return instance;
}
}
2,Holder方式
package com.wayne.singleDesigPattern;
public final class Singleton {
private byte[] data = new byte[1024];
private Singleton(){
}
/**
* 没有静态变量,初始化Singleton类时,不会创建Singleton实例。
* Holder类中定义Singleton的静态变量并直接实例化,
* 当Holder被主动引用的时候则会创建Singleton的实例。
* Singleton实例创建过程在Java编译时,收集到<clinit>()方法中。此方法为同步方法。
*/
private static class Holder{
private static Singleton instance = new Singleton();
}
public static Singleton getInstance(){
return Holder.instance;
}
}
3,枚举方式
package com.wayne.singleDesigPattern;
/**
* 枚举类不允许被继承,同时是线程安全的且只能被实例化一次。但不能懒加载。
*/
public enum EnumSingleton {
INSTANCE;
private byte[] data = new byte[1024];
EnumSingleton(){
System.out.println("INSTANCE will be initialized immediately");
}
public static void method(){
}
public static EnumSingleton getInstance(){
return INSTANCE;
}
}