zoukankan      html  css  js  c++  java
  • 不一样的单例模式(设计模式九)

    前言

    单例较为简单,所以直接就写代码了。

    正文

    加载的时候实例化

    private static Person person=new Person();
    

    首次使用的时候实例化

    private static Person person;
    
    Static Person()
    {
      person=new Person();
    }
    

    双检查法

    if(person==null)
    {
      lock(object)
      {
         if(person!=null)
         {
             person=new Person();
         }
      }
    }
    return person;
    

    双检查法 存在的问题,在于reorder。

    是这样子的person=new Person()的执行顺序为为person 分配空间,然后实例化,然后给person赋值指针地址。

    但是呢,可能出现下面这种情况分配空间,然后给person赋值指针地址,然后实例化。

    这样参数的问题,就是person不为空,但是又没有实例化,所以返回的person是有问题的。

    这个怎么解决呢?

    1.方案一

    private static volatile Singleton sInstance;

    2.方案二
    public class Singleton {
    private Singleton(){};
    private static class Inner{
    private static Singleton SINGLETION=new Singleton();
    }
    public static Singleton getInstance(){
    return Inner.SINGLETION;
    }
    }
    静态内部类不会随着外部类的初始化而初始化,他是要单独去加载和初始化的,当第一次执行getInstance方法时,Inner类会被初始化。

    所以我们发现在别人的开源代码中一般都是方案二,非常常见,双检查法在现在互联网项目中是存在问题得。

  • 相关阅读:
    FFmpeg之cmdutils.h源码
    iOS文件操作一览
    ffmpeg结构体SpecifierOpt说明文档
    主要流媒体协议介绍
    HTTP Live Streaming直播(iOS直播)技术分析与实现(转)
    XCode快捷键总结
    ALAssetsLibrary获取相册列表
    iOS教程之ASIHttpRequest(源自51CTO.com)
    libxml/tree.h not found(XCode 4.5&5.1解决方案)
    MyBatis——Log4J(日志)
  • 原文地址:https://www.cnblogs.com/aoximin/p/13599533.html
Copyright © 2011-2022 走看看