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类会被初始化。

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

  • 相关阅读:
    vue指令参考
    jquery easyui 研究(一)Datagrid初始化设置
    HTML之响应协议
    HTTP协议之请求协议
    HTTP协议之HTTP概述
    Day18_函数定义_形参_实参_可变参数
    Day19_名称空间和作用域_函数的嵌套_函数第一类对象的使用_闭包函数
    跳转语句 break 和 continue
    JS中强制类型转换
    toString
  • 原文地址:https://www.cnblogs.com/aoximin/p/13599533.html
Copyright © 2011-2022 走看看