单例模式

定义:

一个类只有一个对象实例

例子:

设计模式3 - 单例模式【Singleton Pattern】_单例模式

皇帝要为一个单例:

public class Emperor { 

//定义一个皇帝
private static Emperor emperor = null;

private Emperor(){
//世俗和道德约束你,目的就是不让你产生第二个皇帝
}

public static Emperor getInstance(){
//如果皇帝还没有定义,那就定一个
if(emperor == null){
emperor = new Emperor();
}
return emperor;
}

/**
*皇帝叫什么名字呀
*/
public static void emperorInfo(){
System.out.println("我就是皇帝某某某....");
}
}

代码存在缺陷:


假如现在有两个线程 A 和线程 B,线程 A 执行到 emperor = new Emperor(),正在申请内存分配,可能需要 0.001微秒,就在这 0.001 微秒之内,线程 B 执行到 if(emperor == null),你说这个时候这个判断条件是 true 还是false?是 true,那然后呢?线程 B 也往下走,于是乎就在内存中就有两个 Emperor的实例了。


修改后(本人认为这样还不够好):

//定义一个皇帝
public class Emperor {

private static final Emperor emperor = new Emperor();

public synchronized static Emperor getInstance(){
return emperor;
}
}

修改后(开发的时候我比较倾向于这样):

public class Emperor {

private static Emperor emperor = null;

public static Emperor getInstance(){
if(emperor == null){
synchronized (Emperor.class){
if(emperor == null){
emperor = new Emperor();
}
}
}
return emperor;
}
}