陈胜追击,继续昨天的。
打开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
上面这些代码是没什么明显问题了,可是有人说实际上应用程序很少需要这种类型的实现,后面又给出了两种方案:静态初始化和延迟初始化,明天继续。