单件模式(Singleton):保证一个类仅有一个实例,并提供一个访问它的全局访问点。用户程序调用时不是每次生成一个新的实例,而是都调用该类的一个唯一的实例。
单例模式(Singleton)它拥有一个私有构造函数,这确保用户无法通过new直接实例它。除此之外,该模式中包含一个静态私有成员变量instance与静态公有方法Instance()。Instance()方法负责检验并实例化自己,然后存储在静态成员变量中,以确保只有一个实例被创建。
实现方式一
public class Singleton {
private static Singleton instance;
private Singleton (){}
public static Singleton getInstance() {
if (instance == null) {
instance = new Singleton();
}
return instance;
}
}
该方式式线程不安全的,只有在单线程下才能使用,多线程下会出现多个实例的情况,违反单例模式“唯一性”原则。
实现方式二
public class Singleton {
private static Singleton instance;
private Singleton (){}
public static synchronized Singleton getInstance() {
if (instance == null) {
instance = new Singleton();
}
return instance;
}
}
方式二是线程安全的,但是会影响系统效率以及占用额外的资源,因为同步在大部分情况下都不需要。
实现方式三
public class Singleton {
private Singleton instance = new Singleton();
static {
}
private Singleton (){}
public static Singleton getInstance() {
return this.instance;
}
方式三避免了多线程的同步问题,但是,instance在类加载时就实例化,虽然导致类装载的原因有很多种,在单例模式中大多数都是调用getInstance方法, 但是也不能确定有其他的方式(或者其他的静态方法)导致类装载,这时候初始化instance显然没有达到lazy loading的效果。
实现方式四
public class Singleton {
private static class SingletonHolder {
private static final Singleton INSTANCE = new Singleton();
}
private Singleton (){}
public static final Singleton getInstance() {
return SingletonHolder.INSTANCE;
}
}
该方式通过内部静态类实现instance的实例化,避免了第三种方式在类加载时就实例化的问题,只有在调用getInstance方法时才主动去实例化,实现了lazy loading的效果。
实现方式五
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;
}
}
经典的Double-Checked Locking方法
浙公网安备 33010602011771号