单例设计模式有饿汉式、懒汉式、双重判定锁几种模式。不过在访问量同时在百万以上时,均不适应,前两者线程不安全,后者比较耗费性能,用户体验度也不好。那该怎么去优化呢?
推荐使用静态内部类的单例模式。但是如何在反射的情况下保证单例?如何在反序列化中保证单例?
下面代码即可解决:
package singleton;
import java.io.Serializable;
public class LazySingleton4 implements Serializable {
private static boolean initialized = false;
private LazySingleton4() {
synchronized (LazySingleton4.class) {
if (initialized == false) {
initialized = !initialized;
} else {
throw new RuntimeException("单例已被破坏");
}
}
}
static class SingletonHolder {
private static final LazySingleton4 instance = new LazySingleton4();
}
public static LazySingleton4 getInstance() {
return SingletonHolder.instance;
}
private Object readResolve() {
return getInstance();
}
}
参考网址:https://www.cnblogs.com/rjzheng/p/8946889.html
枚举[极推荐使用]
public enum SingletonEnum {
instance;
private SingletonEnum() {}
public void method(){
}
}
访问方式
SingletonEnum.instance.method();
可以看到枚举的书写非常简单,访问也很简单在这里SingletonEnum.instance这里的instance即为SingletonEnum类型的引用所以得到它就可以调用枚举中的方法了。
借助JDK1.5中添加的枚举来实现单例模式。不仅能避免多线程同步问题,而且还能防止反序列化重新创建新的对象。可能是因为枚举在JDK1.5中才添加,所以在实际项目开发中,很少见人这么写过,这种方式也是最好的一种方式,如果在开发中JDK满足要求的情况下建议使用这种方式。
参考网址https://blog.csdn.net/dmk877/article/details/50311791