设计模式学习笔记1--单例模式
来源:互联网 发布:编写java 用什么软件 编辑:程序博客网 时间:2024/06/03 19:38
单例模式:全局访问+实例化控制
做法:定义Singleton类,让类自身负责保存它的唯一实例,并提供一个访问该实例的方法。
结构图:
1、保证一个类仅有一个实例。
2、可实现对唯一实例的受控访问(可严格控制客户怎样访问、何时访问)。
代码:
class Singleton{ private static Singleton instance; private Singleton() { }//private构造方法,堵死外界利用new创建此类实例的可能 public static Singleton Getstance() { //此方法是获得本实例的唯一全局访问点 if(instance==null) { //若实例不存在,则new一个,否则返回已有实例 instance=new Singleton(); } return instance; }}static void Main(string[] args){ Singleton s1=Singleton.GetInstance(); Singleton s2=Singleton.GetInstance(); if(s1==s2) Console.WriteLine("两个对象是相同的实例"); Console.Read();}
多线程时的单例
如何保证多线程环境下的同时访问也不会造成多个实例的生成?
双重锁定: Double-Check Locking
lock是确保当一个线程位于代码的临界区内,另一个线程不进入临界区。如果其他线程试图进入锁定的代码,则它将一直等待(即被阻止),直到该对象被释放。
代码:
class Singleton{ private static Singleton instance; //程序运行时创建一个静态只读的进程辅助对象 private static readonly object syncRoot=new object(); private Singleton() { } public static Singleton Getstance() { if(instance==null) {//先判断实例是否存在,不存在再加锁处理 lock(syncRoot) { if(instance==null) { instance=new Singleton(); } } } return instance; }}static void Main(string[] args){ Singleton s1=Singleton.GetInstance(); Singleton s2=Singleton.GetInstance(); if(s1==s2) Console.WriteLine("两个对象是相同的实例"); Console.Read();}
静态初始化
C#与公共语言运行库提供了一种“静态初始化”方法,这种方法不需要开发人员显式地编写线程安全代码,即可解决多线程环境下它是不安全的问题。
饿汉式单例类: 在自己被加载前就将自己实例化。
代码:
//阻止发生派生(派生可能会增加实例)public sealed class Singleton{//在第一次引用类的任何成员时创建实例。公共语言运行库负责处理变量初始化 private static readonly Singleton instance=new Singleton(); private Singleton() { } public static Singleton Getstance() { return instance; }}
饿汉式单例类 VS 懒汉式单例类
饿汉式:
1、依赖公共语言运行库来初始化变量。
2、静态初始化的方式,它是类一加载就实例化的对象,所以需要提前占用系统资源。
懒汉式:
1、需要做双重锁定才能保证多线程访问的安全性问题。
2、在第一次被引用时,才会将自己实例化。
阅读全文
0 0
- 设计模式学习笔记:单例模式
- 设计模式学习笔记-单例模式
- 设计模式学习笔记--单例模式
- 设计模式学习笔记-单例模式
- 设计模式学习笔记-单例模式
- 设计模式学习笔记--单例模式
- 设计模式--单例模式学习笔记
- 设计模式学习笔记----单例模式
- 【设计模式学习笔记】单例模式
- 学习设计模式笔记--单例模式
- java设计模式学习笔记1 单例模式
- 设计模式:学习笔记(1)——单例模式
- 设计模式:学习笔记(1)——单例模式
- 设计模式:学习笔记(1)——单例模式
- 设计模式学习笔记1--单例模式
- 【笔记】设计模式 - 1 单例模式
- 学习笔记07-设计模式之单例设计模式
- JavaSE学习笔记--单例设计模式
- Array.prototype.filter()+forEach()
- Python中统计函数的运行耗时
- 进入Ruby的世界——基础篇
- LeetCode:M-647. Palindromic Substrings
- 关于notifydatasetchange的一些理解
- 设计模式学习笔记1--单例模式
- 让js中的函数只有一次有效调用的三种常用方法
- XZ_HTML5之HTML5头部和元信息
- 关于BeanUtils.copyProperties的用法和优缺点
- java基础类的学习---Character类
- Qt两种定时器案例
- context应用启动时创建流程
- LintCode 最长回文子串
- BZOJ3676: [Apio2014]回文串(后缀自动机+manacher/回文自动机)