单件模式确保一个类只有一个实例,并提供一个全局访问点。
单线程
public class Singleton {
private static Singleton uniqueInstance;
private Singleton () {}
public static Singleton getInstance() {
if (uniqueInstance == null) {
uniqueInstance = new Singleton();
}
return uniqueInstance;
}
}
多线程同步
可以解决多线程访问,但同步getInstance方法会造成额外的负担,频繁调用可能会使程序执行效率下降100倍。
public class Singleton {
private static Singleton uniqueInstance;
private Singleton () {}
public static synchronized Singleton getInstance() {
if (uniqueInstance == null) {
uniqueInstance = new Singleton();
}
return uniqueInstance;
}
}
急切单件
如果应用程序总是创建并使用单件实例,或者在创建和运行时方面的负担不太繁重时,可使用急切单件模式。
public class Singleton {
private static Singleton uniqueInstance = new Singleton();
private Singleton () {}
public static Singleton getInstance() {
return uniqueInstance;
}
}
双重检查枷锁单件
利用双重检查枷锁,首先检查是否实例已经创建了,如果不存在,就进入同步区块。进入区块后,再检查一次,如果仍没有创建,才会创建实例。
public class Singleton {
private volatile static Singleton uniqueInstance;
private Singleton () {}
public static Singleton getInstance() {
if (uniqueInstance == null) {
synchronized (Singleton.class) {
if (uniqueInstance == null) {
uniqueInstance = new Singleton();
}
}
}
return uniqueInstance;
}
}
网友评论