嗯,这是本人的第一篇随笔,就从最简单的单例模式开始,一步一步地记录自己的成长。

  单例模式是最常见的设计模式之一,在项目代码中几乎随处可见。这个设计模式的目的就是为了保证实例只能存在一个。单例模式往下还能再细分为懒汉模式和饿汉模式。下面逐个来看。

1.饿汉模式

  饿汉模式的做法是在类加载的时候就完成实例化,是线程安全的做法。

     public class Singleton
{
//类加载的时候完成实例化
private static Singleton instance = new Singleton(); private Singleton()
{
} //直接返回实例
public static Singleton Instance
{
get
{
return instance;
}
}
}

2.懒汉模式

  懒汉模式的做法就是在类加载的时候不创建实例,在第一次使用的时候才创建。但是这种做法并不是线程安全的,如果多个线程同时调用Instance,便会有多个实例创建,这就违反了单例模式的初衷。

     public class Singleton
{
// 类加载的时候不直接创建实例
private static Singleton instance; private Singleton()
{ } public static Singleton Instance
{
get
{
if (instance == null)
{
//第一次使用的时候创建实例
instance = new Singleton();
} return instance;
}
}
}

3.线程安全懒汉模式

  如何保证线程安全的同时又实现懒汉模式?最简单的方式就是在if判断外上锁。

     public class Singleton
{
private static Singleton instance; private static readonly object locker = new object(); private Singleton()
{ } public static Singleton Instance
{
get
{
//上锁
lock (locker)
{
if (instance == null)
{
instance = new Singleton();
}
} return instance;
}
}
}

  但是这种做法在每次访问前的需要上锁,会影响多线程的性能,于是我们又有了双重检验锁。

4.双重检验锁

  我们只需要在上锁之前再作一次if判断,就不会每次访问的时候都需要上锁了。

     public class Singleton
{
private static Singleton instance; private static readonly object locker = new object(); private Singleton()
{ } public static Singleton Instance
{
get
{
if (instance == null)
{
lock (locker)
{
if (instance == null)
{
instance = new Singleton();
}
}
} return instance;
}
}
}

C#设计模式 —— 单例模式的更多相关文章

  1. 设计模式 单例模式(Singleton) [ 转载2 ]

    设计模式 单例模式(Singleton) [ 转载2 ] @author java_my_life 单例模式的结构 单例模式的特点: 单例类只能有一个实例. 单例类必须自己创建自己的唯一实例. 单例类 ...

  2. 设计模式 单例模式(Singleton) [ 转载 ]

    设计模式 单例模式(Singleton) [ 转载 ] 转载请注明出处:http://cantellow.iteye.com/blog/838473 前言 懒汉:调用时才创建对象 饿汉:类初始化时就创 ...

  3. c#设计模式-单例模式(面试题)

    c#设计模式-单例模式 单例模式三种写法: 第一种最简单,但没有考虑线程安全,在多线程时可能会出问题, public class Singleton { private static Singleto ...

  4. java设计模式单例模式 ----懒汉式与饿汉式的区别

    常用的五种单例模式实现方式 ——主要: 1.饿汉式(线程安全,调用率高,但是,不能延迟加载.) 2.懒汉式(线程安全,调用效率不高,可以延时加载.) ——其他: 1.双重检测锁式(由于JVM底层内部模 ...

  5. 最简单的设计模式——单例模式的演进和推荐写法(Java 版)

    前言 如下是之前总结的 C++ 版的:软件开发常用设计模式—单例模式总结(c++版),对比发现 Java 实现的单例模式和 C++ 的在线程安全上还是有些区别的. 概念不多说,没意思,我自己总结就是: ...

  6. ES6教程-字符串,函数的参数,了解函数的arguments对象,js面向对象,设计模式-单例模式,解构赋值

    前言 主要讲解了ES6对字符串的拓展,包括includes,startsWith和endsWith,另外增加了字符串模板. Start includes()是否包含 startsWith()以什么开头 ...

  7. Java设计模式の单例模式

    -------------------------------------------------- 目录 1.定义 2.常见的集中单例实现 a.饿汉式,线程安全 但效率比较低 b.单例模式的实现:饱 ...

  8. java设计模式——单例模式(一)

    一. 定义与类型 定义:保证一个类仅有一个实例,并提供一个全局访问点 类型:创建型 二. 适用场景 想确保任何情况下都绝对只用一个实例 三. 优缺点 优点: 在内存里只有一个实例,减少了内存开销 可以 ...

  9. php实现设计模式————单例模式

    php实现设计模式————单例模式 什么是单例模式 为什么要使用单例模式 php中有哪些方式实现新建一个对象实例 如何阻止这种实例化实现理想的单例模式 代码实现 什么是单例模式 为什么要使用单例模式 ...

  10. JAVA设计模式-单例模式(Singleton)线程安全与效率

    一,前言 单例模式详细大家都已经非常熟悉了,在文章单例模式的八种写法比较中,对单例模式的概念以及使用场景都做了很不错的说明.请在阅读本文之前,阅读一下这篇文章,因为本文就是按照这篇文章中的八种单例模式 ...

随机推荐

  1. Hadoop、Hive、Spark 之间关系

    作者:Xiaoyu Ma ,大数据工程师 大数据本身是个很宽泛的概念,Hadoop生态圈(或者泛生态圈)基本上都是为了处理超过单机尺度的数据处理而诞生的.你可以把它比作一个厨房所以需要的各种工具.锅碗 ...

  2. android热加载随记

    在我们日常的开发过程中,程序难免会出现BUG,一般有集中处理方式,发布新版本APP让用户来升级,或者打补丁来修复bug 前者本文在这里不错讨论,打补丁升级又分为两种一种是需要重启应用,一种是不需要.不 ...

  3. data encryption

    package com.itheima; import java.util.Scanner; /* * 需求:键盘录入数据,要求数据是四位的整数,现需要对数据进行加密,加密规则如下: * 每位数字都加 ...

  4. flask请求流程

  5. resin发布spring-boot项目报错“java.lang.NoSuchMethodError: org.jboss.logging.Logger.getMessageLogger”

    说白了还是jar包冲突问题,直接说解决方式: 首先将resin/lib下的validation-api-1.0.0.GA.jar替换成项目中的包validation-api-2.0.1.Final.j ...

  6. 基于双下划线的跨表查询 (join查询)

    因为你的数据库中的查询就是重点  那么你的django提供的orm也是查询语句最重点 ,也提供的查询方法比较的多,下面我们学习下类似于MYSQL的连表(join)查询 Django 还提供了一种直观而 ...

  7. map() Filter() lambda函数说明

    map()函数接收两个参数,一个是函数,一个是序列,map将传入的函数依次作用到序列的每个元素,并把结果作为新的list返回 #通过map()函数将list中的数字转换为字符 map(str,rang ...

  8. React学习笔记(七)条件渲染

    React学习笔记(七) 六.条件渲染 使用if或条件运算符来创建表示当前状态的元素. 可以使用变量来存储元素.比如: let button = null; if (isLoggedIn) { but ...

  9. Python学习---面向对象的学习[基础]

    面向对象 面向对象的三大特性是指:封装.继承和多态. 说明: Python可以函数式编程,也可以面向对象编程 l 面向过程:根据业务逻辑从上到下写垒代码 l 函数式 :将某功能代码封装到函数中,日后便 ...

  10. Linux 下Wordpress博客搭建

    Wordpress # 下载安装文件 cd /usr/local/nginx/html/blog wget https://cn.wordpress.org/wordpress-4.8.1-zh_CN ...