单例模式
定义:
一个类只有一个对象实例
例子:
皇帝要为一个单例:
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;
}
}
网友评论