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

2019-08-26  本文已影响0人  阿甘兄

单例模式

定义:
一个类只有一个对象实例

例子:

这里写图片描述

皇帝要为一个单例:

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;
      }
 }
上一篇下一篇

猜你喜欢

热点阅读