美文网首页
设计模式3 - 单例模式【Singleton Pattern】

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

作者: 阿甘兄 | 来源:发表于2019-08-26 13:54 被阅读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;
          }
     }
    

    相关文章

      网友评论

          本文标题:设计模式3 - 单例模式【Singleton Pattern】

          本文链接:https://www.haomeiwen.com/subject/iibrectx.html