单件模式(Singleton)和锁定(lock)
2010-02-28 23:40
351 查看
利用过年休假的时间,重读《设计模式》一书,做了一些笔记,这是第一篇
单件模式,或者也可以称为单例模式(singleton)是23种常见模式中最简单的,也是第一个模式。它的目的是保证一个类(class)在应用系统中只有一个实例(instance),为什么要这么做呢?有两个主要原因
节省内存(因为只有一个实例了,所以内存自然会更节省)保存状态,例如要做整个程序级别的计数统计这一类的工作。
单例模式的做法,主要是将类型的默认构造函数(无参构造器)的访问级别降低(设置为private),这样就无法通过new关键字来创建实例,然后在类型中提供一个静态的方法,即所有的调用都必须通过这个方法来取得实例,这时就自然有办法进行一些控制了。
既然用一个实例,就多多少少会涉及到资源争用的问题,也就是说多个线程可能在同一个时间需要操作实例中的某些资源。.NET中提供的线程同步技术可以保证资源的修改是不会有冲突的。
对于单件模式,我简要总结如下
控制实例化并不常用可以由静态类代替
下面是一个综合例子
.csharpcode,.csharpcodepre
{
font-size:small;
color:black;
font-family:consolas,"CourierNew",courier,monospace;
background-color:#ffffff;
/*white-space:pre;*/
}
.csharpcodepre{margin:0em;}
.csharpcode.rem{color:#008000;}
.csharpcode.kwrd{color:#0000ff;}
.csharpcode.str{color:#006080;}
.csharpcode.op{color:#0000c0;}
.csharpcode.preproc{color:#cc6633;}
.csharpcode.asp{background-color:#ffff00;}
.csharpcode.html{color:#800000;}
.csharpcode.attr{color:#ff0000;}
.csharpcode.alt
{
background-color:#f4f4f4;
width:100%;
margin:0em;
}
.csharpcode.lnum{color:#606060;}
单件模式,或者也可以称为单例模式(singleton)是23种常见模式中最简单的,也是第一个模式。它的目的是保证一个类(class)在应用系统中只有一个实例(instance),为什么要这么做呢?有两个主要原因
节省内存(因为只有一个实例了,所以内存自然会更节省)保存状态,例如要做整个程序级别的计数统计这一类的工作。
单例模式的做法,主要是将类型的默认构造函数(无参构造器)的访问级别降低(设置为private),这样就无法通过new关键字来创建实例,然后在类型中提供一个静态的方法,即所有的调用都必须通过这个方法来取得实例,这时就自然有办法进行一些控制了。
既然用一个实例,就多多少少会涉及到资源争用的问题,也就是说多个线程可能在同一个时间需要操作实例中的某些资源。.NET中提供的线程同步技术可以保证资源的修改是不会有冲突的。
对于单件模式,我简要总结如下
控制实例化并不常用可以由静态类代替
下面是一个综合例子
usingSystem; usingSystem.Collections.Generic; usingSystem.Linq; usingSystem.Text; usingSystem.Threading; namespaceSample { classProgram { staticvoidMain(string[]args) { for(inti=0;i<10;i++) { Threadt=newThread(()=> { Singleton.getInstance(); }); t.Start(); } Console.Read(); } } publicclassSingleton { privateSingleton(){} privatestaticSingletoninstance=null; privatestaticobjectobj=newobject(); publicstaticSingletongetInstance() { Console.WriteLine("线程号:{0}于{1}进入方法",Thread.CurrentThread.ManagedThreadId,DateTime.Now); lock(obj) { Console.WriteLine("线程号:{0}于{1}进入锁定",Thread.CurrentThread.ManagedThreadId,DateTime.Now); Thread.Sleep(5000);//休眠5秒钟 //这个方法比上面有所改进,不用每次都进行生成对象,只是第一次//使用时生成实例,提高了效率! if(instance==null) instance=newSingleton(); Console.WriteLine("线程号:{0}于{1}完成操作",Thread.CurrentThread.ManagedThreadId,DateTime.Now); returninstance; } } } }
该程序运行的效果如下
也就是说,不同的线程确实可以同时进入一个方法,但如果遇到了lock语句,而且lock语句块没有结束之前,它就需要等待,这样就是依此进入的效果
.csharpcode,.csharpcodepre
{
font-size:small;
color:black;
font-family:consolas,"CourierNew",courier,monospace;
background-color:#ffffff;
/*white-space:pre;*/
}
.csharpcodepre{margin:0em;}
.csharpcode.rem{color:#008000;}
.csharpcode.kwrd{color:#0000ff;}
.csharpcode.str{color:#006080;}
.csharpcode.op{color:#0000c0;}
.csharpcode.preproc{color:#cc6633;}
.csharpcode.asp{background-color:#ffff00;}
.csharpcode.html{color:#800000;}
.csharpcode.attr{color:#ff0000;}
.csharpcode.alt
{
background-color:#f4f4f4;
width:100%;
margin:0em;
}
.csharpcode.lnum{color:#606060;}
相关文章推荐
- 单件模式(Singleton)和锁定(lock)
- Design Pattern_Singleton(单件模式)和Double-Checked Locking(双重检查锁定)
- Singleton<T>单例模式,不用Lock的实现版本,限制条件是:被单例的类 必须有一个无参构造函数
- 单件模式在C#中的实现--Implementing the Singleton Pattern in C#
- 设计模式--创建型-SINGLETON(单件)
- Python中的Singleton (单件)模式
- 设计模式笔记--创建型模式之五--单件 Singleton
- 单实例模式的实现(singleton)----单件
- 设计模式单件(Singleton)---对象创建型模式
- 设计模式--创建型-Singleton(单例单件)
- C#面向对象设计模式纵横谈(2):Singleton 单件(创建型模式)
- 四种方法实现单件(Singleton)模式
- 基于私有化构造器与析构器的单件模式(singleton) 实现及注释
- 【设计模式学习笔记】Singleton单件模式
- 设计模式六:singleton单件模式——对象创建型模式
- Singleton (单件模式)
- 设计模式学习笔记(二)——Singleton单件模式
- 单件模式(Singleton)
- singleton(单件)-对象创建型模式
- 创建型模式-单件(Singleton)