设计模式之单件模式续

【这是以前写在博客园的,那里荒废了就转过来】 陈胜追击,继续昨天的。 打开Form2我是没用线程,可是对一个日志记录类用了多线程来处理。多线程嘛,用之前的那种方法就会存在问题:当线程1去判断对象是否为null成立后把CPU控制权交给线程2,线程2也判断对象是否为null成立然后new出一个对象,这之后线程1运行后直接又new出一个对象,这不就出现了两个实例么。所以就有了下面的解决方案:在GetInstance()开始时加锁。实例代码如下: [csharp] private static EventLog instance; private static readonly object syncRoot = new object();//这个静态只读对象用来辅助加锁 private EventLog() //注意是私有 { } public static EventLog GetInstance() { lock (syncRoot)//加锁,同一时间只有一个线程能访问它。 { if (instance == null) { instance = new EventLog(); } } return instance; } [/csharp]     上面的代码有没有问题呢?问题是没有,对于线程是安全的。仔细观察就发现并不好,每次GetInstance()时不管instance是否为null总要加锁,增加了很多不必要的开销,降低了性能。于是有了下面的解决方案: [csharp] private static EventLog instance; private static readonly object syncRoot = new object();private EventLog() { }public static EventLog GetInstance() { if (instance == null)//如果对象存在,则没必要加锁了。 { lock (syncRoot) { if (instance == null) { instance = new EventLog(); } } } return instance; } [/csharp]    

上面这些代码是没什么明显问题了,可是有人说实际上应用程序很少需要这种类型的实现,后面又给出了两种方案:静态初始化和延迟初始化,明天继续。