单例实现方式
有时候需要采用延迟初始化来降低初始化类和创建对象的开销。双重检查锁定是常见的延时初始化技术。
基于volatile的单例,双锁检测
该方式中,必须使用volatile
关键字来声明instance
变量。因为对象的初始化代码可能会被重排序,也就是说instance
在未初始化完成前,可能已经被其他线程访问。 volatile
标识符可以禁止这种重排序。
public class Singleton {
private volatile static Singleton instance;
public static Singleton getInstance() {
if (instance == null) {
synchronized (Singleton.class) {
if (instance == null) {
instance = new Singleton();
}
}
}
return instance;
}
}
基于类的单例
在初次调用Instance.getInstance()时初始化Instance变量,利用语言的线程安全保证静态初始化,不需要额外的同步。
public class Instance {
private static class InstanceHolder {
public static Instance instance = new Instance();
}
public static Instance getInstance() {
return InstanceHolder.instance;
}
}
基于枚举类型的懒加载单例
枚举类型使用私有的构造器,能够提供适当的序列化机制。他们也能以线程安全的方式懒初始化。 JVM保证了枚举值不会被多次实例化,这使得单例模式有非常大的防御反射的攻击。 这种方式是实现单例模式的推荐模式。
public enum EnumSingleton{
INSTANCE;
private EnumSingleton singleton;
//JVM会保证此方法绝对只调用一次
Singleton(){
singleton = new EnumSingleton();
System.out.println(122);
}
public EnumSingleton getInstance(){
return singleton;
}
}
local_offer #java
navigate_before git 版本管理工具 navigate_next 青海湖四日游