设计模式:单例模式(Singletion)
单例模式(Singletion):保证一个类仅有一个实例,并提供一个访问该实例的全局访问点。
单例模式主要作用是保证唯一的实例,可以严格地控制客户端怎样访问该实例以及何时访问它。可以简单的理解为对唯一实例的受控访问。
Singleton |
-instance:Singleton |
-Singleton() +GetInstance() |
Singleton类作为我们要进行单例操作的类,在类中定义一个静态的GetInstance操作函数,允许客户端访问其唯一实例,主要用于创建自己的唯一实例。
public class Singleton
{
private static Singleton Instance; private Singleton() { } public static Singleton GetInstance()
{
if (Instance == null)
{
Instance = new Singleton();
}
return Instance;
}
}
客户端调用
Singleton singleton = Singleton.GetInstance();
以上为简单的单例模式的示例,在单线程程序中可以很好的完成任务。而当我们的程序为多线程时就可能出现问题。
在多线程程序中,当多个线程同时访问GetInstance()时就可能产生多个实例。因此在多线程程序中需要对我们的单例类进行进一步的完善:
public class Singleton
{
private static Singleton Instance;
private static readonly object syncRoot = new object(); private Singleton() { } public static Singleton GetInstance()
{
if (Instance == null)----------先判定是否是否存在实例,如存在则直接返回,避免无用的加锁影响性能。
{
lock (syncRoot)
{
if (Instance == null)----------双重加锁
{
Instance = new Singleton();
}
}
}
return Instance;
}
}
另外C#与公共语言运行库也提供了一种静态初始化方法,不需要我们显式的编写线程安全代码,即可以解决多线程程序中不安全的问题。
public sealed class Singleton----封闭类,不能被集成
{
private static readonly Singleton instance = new Singleton();-----readonly标示了该实例只能在初始化中分配。 private Singleton() { } public static Singleton GetInstance()
{
return instance;
}
}
这种静态初始化方式只在类被加载的时候将类实例化,因此被称为饿汉式单例模式。之前的两种写法都是在第一次被引用的时候才会将类实例化,因此被称为懒汉式单例模式。
饿汉式单例模式在程序加载该类的时候就对类进行了初始化,这时候我们可能并不会马上使用,所以会提前占用系统的资源。但是懒汉式单例模式则需要考虑多线程不安全问题,对类实例化
的过程进行双重加锁以保证实例化的安全。两种方式各有好处,具体需要根据我们在开发的时候根据应用的具体场景需求选择最佳的单例模式。
设计模式:单例模式(Singletion)的更多相关文章
- java设计模式单例模式 ----懒汉式与饿汉式的区别
常用的五种单例模式实现方式 ——主要: 1.饿汉式(线程安全,调用率高,但是,不能延迟加载.) 2.懒汉式(线程安全,调用效率不高,可以延时加载.) ——其他: 1.双重检测锁式(由于JVM底层内部模 ...
- 设计模式 单例模式(Singleton) [ 转载2 ]
设计模式 单例模式(Singleton) [ 转载2 ] @author java_my_life 单例模式的结构 单例模式的特点: 单例类只能有一个实例. 单例类必须自己创建自己的唯一实例. 单例类 ...
- 设计模式 单例模式(Singleton) [ 转载 ]
设计模式 单例模式(Singleton) [ 转载 ] 转载请注明出处:http://cantellow.iteye.com/blog/838473 前言 懒汉:调用时才创建对象 饿汉:类初始化时就创 ...
- c#设计模式-单例模式(面试题)
c#设计模式-单例模式 单例模式三种写法: 第一种最简单,但没有考虑线程安全,在多线程时可能会出问题, public class Singleton { private static Singleto ...
- 最简单的设计模式——单例模式的演进和推荐写法(Java 版)
前言 如下是之前总结的 C++ 版的:软件开发常用设计模式—单例模式总结(c++版),对比发现 Java 实现的单例模式和 C++ 的在线程安全上还是有些区别的. 概念不多说,没意思,我自己总结就是: ...
- ES6教程-字符串,函数的参数,了解函数的arguments对象,js面向对象,设计模式-单例模式,解构赋值
前言 主要讲解了ES6对字符串的拓展,包括includes,startsWith和endsWith,另外增加了字符串模板. Start includes()是否包含 startsWith()以什么开头 ...
- Java设计模式の单例模式
-------------------------------------------------- 目录 1.定义 2.常见的集中单例实现 a.饿汉式,线程安全 但效率比较低 b.单例模式的实现:饱 ...
- java设计模式——单例模式(一)
一. 定义与类型 定义:保证一个类仅有一个实例,并提供一个全局访问点 类型:创建型 二. 适用场景 想确保任何情况下都绝对只用一个实例 三. 优缺点 优点: 在内存里只有一个实例,减少了内存开销 可以 ...
- php实现设计模式————单例模式
php实现设计模式————单例模式 什么是单例模式 为什么要使用单例模式 php中有哪些方式实现新建一个对象实例 如何阻止这种实例化实现理想的单例模式 代码实现 什么是单例模式 为什么要使用单例模式 ...
- JAVA设计模式-单例模式(Singleton)线程安全与效率
一,前言 单例模式详细大家都已经非常熟悉了,在文章单例模式的八种写法比较中,对单例模式的概念以及使用场景都做了很不错的说明.请在阅读本文之前,阅读一下这篇文章,因为本文就是按照这篇文章中的八种单例模式 ...
随机推荐
- Linux如何配置ftp服务器、给ftp服务器添加访问用户
本人qq群也有许多的技术文档,希望可以为你提供一些帮助(非技术的勿加). QQ群: 281442983 (点击链接加入群:http://jq.qq.com/?_wv=1027&k=29Lo ...
- Django【第10篇】:Django之分页初级版本
分页和中间件 一.分页 Django的分页器(paginator) view.py from django.shortcuts import render,HttpResponse # Create ...
- MySQL的运行模式及一些特性,引擎、事务、并发控制、优化总结
一 MySQL总体架构 上图是<高性能MySQL>中对MySQL总体架构的描述,客户端对服务端的连接有很多条,有一个专门的处理组件,类似tomcat使用线程池处理请求.解析器负责解析sql ...
- Java课程作业02
01. 一.设计思想: 第一种使用n!的公式直接计算,利用递归方法求n! 第二种使用递推的公式,利用递归返回求和. 二.程序流程图 三.源代码 import java.util.*;import ja ...
- A1046
n个节点围成一个环,每个节点之间的距离已知.输入n并给出n个节点的距离,输入m组节点编号(两个),求这两个节点编号间的最短距离. 1 建立dis[]数组,记录V1点到每一个点的顺时针距离,sum计算环 ...
- SonarQube规则之bug类型
1.".equals()" should not be used to test the values of "Atomic" classes.bug 主要不要 ...
- 查询重复数据group by menu_id having count(menu_id)>1
select * from sys_power_menu WHERE menu_id in ( select menu_id from sys_power_menu group by menu_id ...
- HOJ 2315 Time(模拟)
Description Kim是一个掌控时间的大师.不同于一般人,他习惯使用秒来计算时间.如果你问他现在是几点,他会告诉你现在是今天的xxxx秒.Mik想要考考Kim.他想知道从某一天的00:00:0 ...
- Android-Studio:Cannot reload AVD list
Android-Studio:Cannot reload AVD list 今天用Android-Studio时点击"RUN"后出现如下错误,特此记录一下解决方案. Cannot ...
- [CSP-S模拟测试]:超级树(DP)
题目传送门(内部题5) 输入格式 一行两个整数$k$.$mod$,意义见上. 输出格式 一行一个整数,代表答案. 样例 样例输入1: 2 100 样例输出1: 样例输入2: 3 1000 样例输出2: ...