SunK

无聊,竟也无聊的苍白
  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

设计模式之单件模式续

Posted on 2009-03-01 00:53  SunK  阅读(228)  评论(0编辑  收藏  举报

    陈胜追击,继续昨天的。

    打开Form2我是没用线程,可是对一个日志记录类用了多线程来处理。多线程嘛,用之前的那种方法就会存在问题:当线程1去判断对象是否为null成立后把CPU控制权交给线程2,线程2也判断对象是否为null成立然后new出一个对象,这之后线程1运行后直接又new出一个对象,这不就出现了两个实例么。所以就有了下面的解决方案:在GetInstance()开始时加锁。实例代码如下:


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;
}

 

    上面的代码有没有问题呢?问题是没有,对于线程是安全的。仔细观察就发现并不好,每次GetInstance()时不管instance是否为null总要加锁,增加了很多不必要的开销,降低了性能。于是有了下面的解决方案:

Code


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