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