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()后才实例化出唯一的单例对象。

  • 相关阅读:
    leetcode--Populating Next Right Pointers in Each Node II
    leetcode—Populating Next Right Pointers in Each Node
    Pascal's Triangle II
    leetcode—pascal triangle
    leetcode—triangle
    October 23rd, 2017 Week 43rd Monday
    October 22nd, 2017 Week 43rd Sunday
    October 21st 2017 Week 42nd Saturday
    October 20th 2017 Week 42nd Friday
    October 19th 2017 Week 42nd Thursday
  • 原文地址:https://www.cnblogs.com/Precious/p/4674082.html
Copyright © 2011-2022 走看看