在看单例模式的时候,无意中看到牛人介绍可以使用枚举来实现单例,甚是惊奇,在这里mark一下,另附上双重校验锁和内部类实现方法如下:
一:双重校验锁
/**
* 单例:双重校验锁(存在风险,当初始化和读取乱序时,造成混乱)
* Feature:jdk1.5之后才能正常达到单例效果
* (JDK5及以后的版本扩展了原有Volatile的语义以确保系统对一个Volatile变量的写操作跟前面的读写操作不会被重新排序,
* 读操作也如此。更多的细节见: this entry in Jeremy Manson's blog,这样,在双检锁中声明helper变量为Volatile即可,
* 这种方式在JDK1.4及以前不能正常工作)
* @author yongmengsong
*
*/
public class LogUtilSync {
// private static LogUtilSync logUtil = null;
private static volatile LogUtilSync logUtil = null;
private LogUtilSync() {
}
public static LogUtilSync getInstance() {
if(logUtil == null) {
synchronized(LogUtilSync.class) {
if(logUtil == null) {
logUtil = new LogUtilSync();
}
}
}
return logUtil;
}
}
二:内部类
/**
* 单例:静态内部类
* Feature:线程安全;延迟加载
* @author yongmengsong
*
*/
public class LogUtilInnerClass {
private static class LogUitlSingletonHolder {
private static final LogUtilInnerClass logUtil = new LogUtilInnerClass();
}
private LogUtilInnerClass() {
}
public static LogUtilInnerClass getInstance() {
return LogUitlSingletonHolder.logUtil;
}
}
三:枚举实现
/**
* 单例:枚举(自动实现序列化,线程同步,以后会慢慢变成单例的主要实现方式)
* Feature:从Java1.5开始支持;无偿提供序列化机制,绝对防止多次实例化,即使在面对复杂的序列化或者反射攻击的时候
* @author yongmengsong
*
*/
public enum LogUtilEnum {
Instance;
}
是的,你没有看错,枚举就是这样简单!
猜想以后枚举来实现单例会越来越流行的!