饿汉式单例
package top.xinzhang0618.producer.singleton;
/**
* EagerSingleton
*
* @author xinzhang
* @author Shenzhen Greatonce Co Ltd
* @version 2019/12/23
* 饿汉式单例: 将构造方法私有化, 通过getInstance方法获取对象
* 缺点: 无论对象后续是否使用, 在内存中都会存在这个对象, 若对象分配了大量资源并未使用, 会对系统性能产生影响
*/
public class EagerSingleton {
private static final EagerSingleton instance = new EagerSingleton();
// // 也可以通过静态代码块来初始化
// private static final EagerSingleton instance;
//
// static {
// try {
// instance = new EagerSingleton();
// } catch (Exception e) {
// throw e;
// }
// }
private EagerSingleton() {
}
public static EagerSingleton getInstance() {
return instance;
}
}
饱汉式单例
package top.xinzhang0618.producer.singleton;
/**
* LazySingleton
*
* @author xinzhang
* @author Shenzhen Greatonce Co Ltd
* @version 2019/12/23
* 饱汉式单例: 将构造方法私有化, 通过getInstance方法获取对象
* 第一步判断instance是否等于null,假如此时thread1和thread2同时判断都为null.
* 同步代码块儿能保证只有一个线程进入到下面的代码去创建一个示例,其中使用了volatile关键字,
* 保证了instance实例在所有线程的可见性,这个关键字是十分有必要的.当thread1创建一个实例之后,thread2能够第一时间拿到实例并返回
*/
public class LazySingleton {
private static volatile LazySingleton instance;
private LazySingleton() {
}
// 双重检查优化
public static LazySingleton getInstance() {
if (instance == null) {
synchronized (Singleton.class) {
if (instance == null) {
instance = new Singleton();
}
}
}
return instance;
}
}
静态内部类单例类
package top.xinzhang0618.producer.singleton;
/**
* LazyInnerClassSingleton
*
* @author xinzhang
* @author Shenzhen Greatonce Co Ltd
* @version 2019/12/23
* 静态内部类单例类: 调用getInstance方法时才回去加载静态内部类, 也是线程安全的
* 既不会占用资源, 又保证了按需加载
*/
public class LazyInnerClassSingleton {
private LazyInnerClassSingleton() {
}
private static class SingletonHelper {
private static final LazyInnerClassSingleton INSTANCE = new LazyInnerClassSingleton();
}
public static LazyInnerClassSingleton getInstance() {
return SingletonHelper.INSTANCE;
}
}
枚举单例类
package top.xinzhang0618.producer.singleton;
/**
* EnumSingleton
*
* @author xinzhang
* @author Shenzhen Greatonce Co Ltd
* @version 2019/12/23
* 枚举单例类: 枚举可以防止反射和反序列化破坏,但是使用起来不太灵活
*/
public enum EnumSingleton {
INSTANCE {
@Override
protected void testPrint() {
System.out.println("测试枚举单例类");
}
};
protected abstract void testPrint();
private Object data;
public Object getData() {
return data;
}
public void setData(Object data) {
this.data = data;
}
public static EnumSingleton getInstance() {
return INSTANCE;
}
}