c# - 多线程应用程序中的单例类,锁定建议

标签 c# class locking thread-safety

我有在多个线程中共享的单例类。为了防止多次访问问题,我在访问类的一个或另一个属性时使用 Lock 方法。问题是是否可以改进代码并将 Lock 方法放入单例类中,而不是每次在代码中访问类属性时都将其放入?

/* Class code*/
   public class ServerStatus
    {


        private static ServerStatus _instance;
        public static ServerStatus Instance
        {
            get { return _instance ?? (_instance = new ServerStatus()); }
            set { _instance = value; }
        }

        ServerStatus()
        {
            PistonCount = 0;
            PistonQueue = new List<string>();
            ErrorList = new List<string>();
        }




        public int PistonCount { get; set; }

        public List<string> PistonQueue { get; set; }

        public List<string> ErrorList { get; set; }
    }



 /*Code for accessing class properties*/
private static readonly object Locker = new object();    
/*Skip*/

lock (Locker)
{
 ServerStatus.Instance.PistonQueue.Add(e.FullPath);
}
    /*Skip*/

lock (Locker)
{
    ServerStatus.Instance.PistonCount++;
}

最佳答案

ServerStatus应该保持自己的同步,而不是这个类的外部客户端。也就是说,您需要重构 ServerStatus并创建一些线程安全(带锁定)方法:

删除这些属性:public List<string> PistonQueue { get; set; }因为即使您可以锁定这些属性,您也无法控制客户在获得实际 PistonQueue 后的行为。 .

...并替换为如下方法(抱歉伪代码,我今天懒得去想):

public PistonQueueAdd(string fullPath)
{
    lock(_serverStatusSyncRoot)
    {
        // ...
    }
}

关于c# - 多线程应用程序中的单例类,锁定建议,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6439743/

相关文章:

c++ - 如何获得一个 friend 类的模板函数而不会出现错误

sql - NOLOCK 和 UNCOMMITTED 之间有什么区别

c# - prop 和 ctor 快捷方式 + tab 键在 vscode 中不起作用

c# - 发送大于 126 字节的 websockets 消息

python - 如何在 Python 中的类中引用静态属性?

c++ - 对象的大小与没有指针的类的大小不同

python - 只允许一个 python 脚本实例?

超过 MySQL 锁等待超时

c# - Windows 8 Metro App 仅在读取文件时在调试器中启动

c# - 遵循不安全的数组索引是否有任何性能差异?