zoukankan      html  css  js  c++  java
  • 单例模式详解

    使用单例模式可以减少内存消耗,一般写法如下:

    public class Application {
        private static volatile Application instance;
        private Application(){
        }
        public static Application getInstance(){
            if (instance == null){
                synchronized (Application.class){
                    if (instance == null){
                        instance = new Application();
                    }
                }
            }
            return instance;
        }
    }

    第一个 instance == null 主要是为了解决 有instance的时候直接renturn

    第二个 synchronized (Application.class) 主要是了解决线程同步的问题

    第三个 instance == null  有可能第一个线程new出来application,但是第二个线程刚得到锁,所以这个地方必须在加一次非空验证。

    volatile的作用主要是为了防止指令重排序。

    先解释下指令重排序:一般来说,处理器为了提高程序运行效率,可能会对输入代码进行优化,它不保证程序中各个语句的执行先后顺序同代码中的顺序一致,但是它会保证程序最终执行结果和代码顺序执行的结果是一致的。

    为展示此事件的发生情况,假设代码行 instance =new Singleton(); 执行了下列伪代码:

    mem = allocate();             //为单例对象分配内存空间.
    instance = mem;               //注意,instance 引用现在是非空,但还未初始化
    ctorSingleton(instance);    //为单例对象通过instance调用构造函数

    当线程1只是给instance设置了一块内存空间时,线程2 instance就不会为空,结果就会返回一个只是有内存空间但是没有调用构造函数的instance

     instance =new Singleton(); 的正确的执行流程应该是:

    1.先给单例对象分配一块内存空间。

    2.在这个内存空间上执行构造函数。

    3.将instance引用指向真实地址。

  • 相关阅读:
    .NET Core 之 MSBuild 介绍
    棒!使用.NET Core构建3D游戏引擎
    在ASP.NET Core MVC中构建简单 Web Api
    TypeScript 中的 SOLID 原则
    《C# 并发编程 · 经典实例》读书笔记
    ASP.NET Core 中的那些认证中间件及一些重要知识点
    消息队列 Kafka 的基本知识及 .NET Core 客户端
    【数列区间询问中的分块思想】
    2013 Multi-University Training Contest 8
    2013 Multi-University Training Contest 7
  • 原文地址:https://www.cnblogs.com/sharkchao/p/10272952.html
Copyright © 2011-2022 走看看