实施Singleton ...带锁吗?

Mig*_*ura 1 c#

在多线程应用程序(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

}
Run Code Online (Sandbox Code Playgroud)

我想我应该实行双锁?没有?

我不确定这样做的最好方法.我能帮忙吗?

谢谢你,米格尔

Eri*_*ert 10

我希望这个类是静态的,就像单身一样

要在C#中正确实现单例,请参阅Jon Skeet关于什么有效和无效的优秀摘要:

http://csharpindepth.com/Articles/General/Singleton.aspx

我想我应该实行双锁?没有?

不可以.双重检查锁定是一种低锁技术,因此在弱内存模型硬件上非常危险.一旦你从一个"幸福"的模式中迷失了最轻微的那一刻,你已经放弃了程序可预测的所有希望.

我将使用双重检查锁定的唯一情况是满足以下所有条件时:

  • 是否有广泛的经验证据表明单次检查锁定会导致性能不佳?
  • 让我们假设单一检查的性能是不可接受的.单一检查锁定通常会因争用而产生不良性能,因此第一步消除了争用.你能消除争用并获得可接受的表现吗?如果无法消除争用或者性能问题是由获得无竞争锁定所需的几纳秒引起的,我只会使用双重检查锁定.在后一种情况下:哇,这是一个快速的程序,那些纳秒是最慢的东西,哇,如果你计算个别纳秒,你有相当严重的性能要求.
  • 我们假设单次检查的性能是不可接受的,无法修复.是否有另一种低锁技术,如使用Interlocked.CompareExchangeLazy<T>具有可接受的性能?至少你知道CompareExchange Lazy<T>是由专家编写的,并且在所有硬件上都适当地强制执行内存屏障.如果已经实施了更好的工具,请不要使用双重检查锁定.
  • 让我们假设这些工具都没有提供可接受的性能. 双重检查锁定是否具有可接受的性能?如果没有,那就不要使用它.


evg*_*nyl 5

我看,你只读数据.所以你不需要锁定IMO.使用静态构造函数来初始化变量,例如Report(使其也是静态的).