Java程序中使用的日志,配置读取等都需要用到单例。
17.1 饿汉模式【可用】
在类加载(连接完成)之后,即创建单例对象。不能实现懒加载,耗资源。
public class Singleton {
private static Singleton instance=new Singleton();
private Singleton(){};
public static Singleton getInstance(){
return instance;
}
}
17.2 懒汉模式
实现懒加载,但线程不安全
public class Singleton {
private static Singleton instance=null;
private Singleton() {};
public static Singleton getInstance(){
if(instance==null){
instance=new Singleton();
}
return instance;
}
}
17.3 懒汉模式【双重校验锁】
实现懒加载,并且线程安全。
public class Singleton {
private volatile static Singleton singleton;
private Singleton (){}
public static Singleton getSingleton() {
if (singleton == null) {
synchronized (Singleton.class) {
if (singleton == null) {
singleton = new Singleton();
}
}
}
return singleton;
}
}
17.4 内部静态类【可用,推荐】
在类初始化时,执行静态类和方法。实现懒加载,并且线程安全。
public class Singleton {
private static class SingletonHolder {
private static final Singleton INSTANCE = new Singleton();
}
private Singleton (){}
public static final Singleton getInstance() {
return SingletonHolder.INSTANCE;
}
}
17.5 枚举类【可用,推荐】
实现懒加载,并且线程安全。是官方推荐的单例实现方式。
public class Singleton {
private Singleton(){
}
private enum SingletonEnum{
INSTANCE;
private final Singleton instance;
SingletonEnum(){
instance = new Singleton();
}
private Singleton getInstance(){
return instance;
}
}
public static Singleton getInstance(){
return SingletonEnum.INSTANCE.getInstance();
}
}
//访问方式
Singleton.getInstance();