Skip to main content
 首页 » 编程设计

c#之实现单例......带锁

2024年01月13日31dyllove98

在多线程应用程序 (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>由专家编写,并在所有硬件上适本地实现内存屏障。如果已经实现了更好的工具,请不要使用双重检查锁定。
  • 让我们假设这些工具都不能提供可接受的性能。 双重检查锁定是否提供可接受的性能?如果不是,则不要使用它。