在多线程应用程序 (ASP.NET MVC) 上,我需要一个全局设置类,其中包含从 Web.Config 获取的常量和值。
我想让这个类静态化,作为单例......并锁定?
public static class Settings {
public static LoggerSettings Logger;
public static MailerSettings Mailer;
public class LoggerSettings {
public String Levels { get { return ConfigurationManager.AppSettings["Logger.Levels"]; } }
public const String Report = "team@xyz.com";
} // LoggerSettings
public class MailerSettings {
public String Contact { get { return ConfigurationManager.AppSettings["Mailer.Contact"]; } }
} // MailerSettings
}
我想我应该实现双锁?没有?
我不确定执行此操作的最佳方法。我可以得到一些帮助吗?
谢谢你, 米格尔
请您参考如下方法:
I would like to have this class static, as singleton
要在 C# 中正确实现单例,请参阅 Jon Skeet 对有效和无效的出色总结:
http://csharpindepth.com/Articles/General/Singleton.aspx
I think I should implement a double lock? No?
没有。双重检查锁定是一种低锁定技术,因此在弱内存模型硬件上非常危险。一旦您偏离了“幸运”模式的最细微之处,您就放弃了程序可预测行为的所有希望。
我会使用双重检查锁定的唯一情况是以下所有为真时:
- 是否有广泛的经验证据表明单一检查锁定会导致性能不佳?
- 让我们假设单一检查性能是 Not Acceptable 。单一检查锁定通常会因争用而导致性能下降,因此第一步是消除争用。您能否消除争用并获得可接受的性能?如果无法消除争用,或者性能问题是由获得无争用锁所需的几纳秒造成的,我只会使用双重检查锁定。在后一种情况下:哇,那是一个快速的程序,那些纳秒是最慢的东西,哇,如果你计算单个纳秒,你有相当严格的性能要求。
- 让我们假设单一检查的性能是 Not Acceptable 并且无法修复。 是否有另一种低锁技术,例如使用 Interlocked.CompareExchange 或
Lazy<T>具有可接受的性能?至少你知道 CompareExchange 和Lazy<T>由专家编写,并在所有硬件上适本地实现内存屏障。如果已经实现了更好的工具,请不要使用双重检查锁定。 - 让我们假设这些工具都不能提供可接受的性能。 双重检查锁定是否提供可接受的性能?如果不是,则不要使用它。
