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

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

  • 相关阅读:
    实现带有头结点的链表
    数据结构之链式线性表
    HDU 1010 dfs+奇偶剪枝
    数据结构之顺序线性表
    POJ 1753 dfs+枚举
    HDU 4277 dfs+set去重
    平衡二叉树
    线性素数筛+欧拉线性筛(证明)
    dp--2019南昌网络赛B-Match Stick Game
    线段树+单调栈+前缀和--2019icpc南昌网络赛I
  • 原文地址:https://www.cnblogs.com/aoximin/p/13599533.html
Copyright © 2011-2022 走看看