您当前的位置: 首页 > 

杨林伟

暂无认证

  • 2浏览

    0关注

    3337博文

    0收益

  • 0浏览

    0点赞

    0打赏

    0留言

私信
关注
热门博文

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

杨林伟 发布时间:2018-01-30 16:39:45 ,浏览量:2

单例模式

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

例子: 这里写图片描述

皇帝要为一个单例:

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;
      }
 }
关注
打赏
1662376985
查看更多评论
立即登录/注册

微信扫码登录

0.1636s