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

    单例模式

    [Wiki]

    单例模式,也叫单子模式,是一种常用的软件设计模式。在应用这个模式时,单例对象的类必须保证只有一个实例存在。

    要点
    1. 某个类只能有一个实例
    2. 必须自行创建这个实例
    3. 必须自行向整个系统提供这个实例

    构建方式

    • 懒汉方式。指全局的单例实例在第一次被使用时构建。
     1 public class Singleton
     2 {
     3 //volatile:不被线程访问和修改
     4 private static volatile Singleton Instance = null;
     5 private static object _lock = new object();
     6 //私有构造
     7 private Singleton() { }
     8 //锁定对象只能被一个线程访问并返回
     9 public static Singleton getInstance()
    10 {
    11 if (Instance == null)
    12 {
    13 lock (_lock)
    14 {
    15 if (Instance == null)
    16 {
    17 Instance=new Singleton();
    18 }
    19 }
    20 }
    21 return Instance;
    22 }
    23 }

    上述代码使用了双重锁方式较好地解决了多线程下的单例模式实现。先看内层的if语句块,使用这个语句块时,先进行加锁操作,保证只有一个线程可以访问该语句块,进而保证只创建了一个实例。再看外层的if语句块,这使得每个线程欲获取实例时不必每次都得加锁,因为只有实例为空时(即需要创建一个实例),才需加锁创建,若果已存在一个实例,就直接返回该实例,节省了性能开销。

    • 饿汉方式。指全局的单例实例在类装载时构建。
    public class Singleton
    {
    //实例私有只读对象
    private static readonly Singleton Instance = new Singleton();
    //私有构造
    private Singleton(){}
    //返回对象
    public static Singleton GetInstance()
    {
    return Instance;
    }
    } 

    上面使用的readonly关键可以跟static一起使用,用于指定该常量是类别级的,它的初始化交由静态构造函数实现,并可以在运行时编译。在这种模式下,无需自己解决线程安全性问题,CLR会给我们解决。由此可以看到这个类被加载时,会自动实例化这个类,而不用在第一次调用GetInstance()后才实例化出唯一的单例对象。

  • 相关阅读:
    maven
    Spring
    多线程
    IO流
    《第一行代码》阅读笔记(二十七)——多媒体播放Demo
    《第一行代码》阅读笔记(二十六)——内容提供器
    《第一行代码》阅读笔记(二十五)——PermissionsDispatcher(补充)
    《第一行代码》阅读笔记(二十四)——Android动态请求权限
    《第一行代码》阅读笔记(二十三)——数据库设计(补充)
    《第一行代码》阅读笔记(二十二)——LitePal操作数据库
  • 原文地址:https://www.cnblogs.com/Precious/p/4674082.html
Copyright © 2011-2022 走看看