单例模式的意义:
如果多个实例会有造成冲突、结果的不一致性等问题。确保一个类最多只有一个实例,并提供一个全局访问点。
经典单例模式:
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 void fill(){
if(empty){
//添加原料巧克力动作
empty=false;
boiled=false;
}
}
private static ChocolateFactory getInstance(){
if(uniqueInstance==null){
uniqueInstance=new ChocolateFactory();
}
return uniqueInstance;
}
public void drain(){
if((!empty)&&boiled){
//排出巧克力动作
empty=true;
}
}
public void boil(){
if((!empty)&&(!boiled)){
//煮沸
boiled=true;
}
}
}
单例模式的多线程问题解决方法:
1.同步锁(synchronized)getInstance方法
private static synchronized ChocolateFactory getInstance(){
if(uniqueInstance==null){
uniqueInstance=new ChocolateFactory();
}
return uniqueInstance;
}
2.“急切”创建实例
private static ChocolateFactory uniqueInstance=new ChocolateFactory();
3.双重检查加锁
private volatile static ChocolateFactory uniqueInstance=null;
private static ChocolateFactory getInstance(){
if(uniqueInstance==null){
synchronized(ChocolateFactory.class){
if(uniqueInstance==null){
uniqueInstance=new ChocolateFactory();
}
}
}
return uniqueInstance;
}