gpt4 book ai didi

c# - 实现单例......带锁?

转载 作者:太空宇宙 更新时间:2023-11-03 17:13:32 24 4
gpt4 key购买 nike

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

关于c# - 实现单例......带锁?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15682498/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com