• 设计模式之单例模式


    设计模式是前辈们对代码日积月累的总结,形成的一种良好的编程思想和技巧。

           单例模式,使用非常广泛,本篇将介绍三种常用的单例模式的实践:类加载时初始化类对象(也叫饿汉模式)、延迟加载初次调用时初始化类对象(也叫饱汉模式)、双重检查机制。

           一、类加载时初始化类对象(也叫饿汉模式):首先构造函数要使用private修改,外部类无法通过new创建类对象;其次定义一个private static类型的类对象并实例化;最后通过public static修改的方法获取类加载时创建的类对象。如果说这个类一次都没使用过,那么初始化操作就是无畏的多余操作。

           二、延迟加载初次调用时初始化类对象(也叫饱汉模式):首先构造函数要使用private修改,外部类无法通过new创建类对象;其次定义一个private static类型的类对象,并不初始化;最后通过public static synchronized修改的方法获取类实例,方法体内,如果类对象为null就创建一个,最终返回。由于使用了synchronized同步关键字,因此同一时刻只有一个线程能获取类实例,性能稍微有影响。

           三、双重检查机制:首先构造函数要使用private修改,外部类无法通过new创建类对象;其次定义一个private static volatile类型的类对象,并不初始化;最后通过public static修改的方法获取类实例,方法体内,会有两次类实例的检查,在第一次检查的内部,使用synchronized同步关键字加锁,这样就保证了最终实例化的时候,只有一个线程创建了对象。由于类对象是用volatile修饰的,因此类对象创建之后会立马更新到主内存,并清空各个线程该对象的副本,强制各个线程重新从主内存获取新的值。从而保证了类对象最终只初始化了一次,而且是延迟加载。推荐使用这种方式创建单例。

           提示:推荐使用双重检查机制,创建单例。

           volatile关键字的作用:对volatile修饰的变量的修改,会立马更新到主内存;将其他线程volatile修饰的变量的副本清空,强制各个线程重新从主内存中获取新的值。

  • 相关阅读:
    转载:混淆包含SlidingMenu、gson等Android代码的proguard写法
    今天解决的两个问题
    C++中指针和引用的区别
    负载均衡服务器session共享的解决方案 (转载)
    Entity Framework的默认值BUG解决方法
    【转】SAPI中的IspeechRecoContext(接口)
    Sapi 添加语法的文章(转载)
    SAPI训练文件存储位置
    Flask第九篇 Flask 中的蓝图(BluePrint)
    Flask 第八篇 实例化Flask的参数 及 对app的配置
  • 原文地址:https://www.cnblogs.com/dushenzi/p/9369088.html
Copyright © 2020-2023  润新知