浅析软件项目开发中的单件模式
http://tech.ddvip.com 2008年01月22日 社区交流
内容摘要:单件(Singleton)模式是设计模式的一个典型且相对简单的构造型模式。本文举实例说明单件模式的主要注意事项和多线程环境下的单件模式。
示例结果清楚地表明instance1和instance2其实是不同的实例对象。同样的,如果单件实例对象通过Remoting在服务器和客户端传递,将会把这个非单件的效果在不同的计算节点间传递。
多线程环境下的单件模式
其实在上面的讨论中,笔者并没有对多线程应用的单件模式保护进行讨论。可以说即便有了私有的构造函数,即便避免了ICloneable接口和SerializableAttribute属性的错误使用,一样会因为并发的instance == null错误判断导致多个instance = new Singleton()语句的执行,最终形成多个实例的出现,为此需要在访问instance == null之前需要增加一个锁来限制单件构造函数的构造过程。
using System;
namespace VisionLogic.DesignPattern.Practice
...{
public class Singleton
...{
private static volatile Singleton instance;
private static object root = new object();
private Singleton() ...{ }
public static Singleton Instance
...{
get
...{
lock (root)
...{
if (instance == null)
instance = new Singleton();
}
return instance;
}
}
}
}
示例9
这里通过简单增加一个lock(root)判断来保证即便运行在多线程环境下,即便并发的调用进入了通过Instance静态属性获得单件引用的情况下,Singleton实例的构造过程唯一性。
但是,这个实现其时存在很大的性能隐患,尤其对于频繁短调用的应用情形而言,一个锁把整个系统的调用归为串行,不管设备节点有多少个N核的CPU。应用其他部分有多大的并发可能执行到这里只能串行,一个锁成了整个应用的瓶颈。为了避免这个情况的出现,需要在lock之前再为其增加一个instance == null的检查,保证instance一旦建立,后面的客户程序调用可以继续以并发方式执行。或者就彻底把这个唯一instance的构造过程通过readonly限制放在一个只会唯一执行一次的某个过程中——Singleton类的静态构造函数中。
来源:IT168 作者:王翔 责编:豆豆技术应用