单例模式:确保一个类最多只有一个实例,并提供一个全局访问点
普通单例模式示例(有问题)
public class Singleton {
private static Singleton uniqueInstance = null;
private Singleton() {
}
public static Singleton getInstance() {
if (uniqueInstance == null) {
uniqueInstance = new Singleton();
}
return uniqueInstance;
}
}
public class ChocolateFactory {
private boolean empty;
private boolean boiled;//是否加热过
private static ChocolateFactory uniqueInstance = null;
private ChocolateFactory() {
empty = true;
boiled = false;
}
public static ChocolateFactory getInstance() {
if (uniqueInstance == null) {
uniqueInstance = new ChocolateFactory();
}
return uniqueInstance;
}
public void fill() {
if (empty) {
//添加原料巧克力动作
empty = false;
boiled = false;
}
}
public void drain() {
if ((!empty) && boiled) {
//排出巧克力动作
empty = true;
}
}
public void boil() {
if ((!empty) && (!boiled)) {
//煮沸
boiled = true;
}
}
}
单例模式优化多线程问题
使用synchronized同步锁(懒汉式),如果调用同步锁方法次数比较少,还可行,如果调用次数比较多,同步锁是比较耗性能的
public class Singleton {
private static Singleton uniqueInstance = null;
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 = null;
private Singleton() {
}
public static Singleton getInstance() {
if (uniqueInstance == null) {
synchronized (Singleton.class){
if(uniqueInstance == null){
uniqueInstance = new Singleton();
}
}
}
return uniqueInstance;
}
}
还有两种是类静态块和枚举,静态块跟饿汉式差不多,就是在类的静态块实例化对象;枚举用的不多