单线程类在多线程应用程序中,锁定建议

Tom*_*mas 7 c# locking class thread-safety

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

/* 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++;
}
Run Code Online (Sandbox Code Playgroud)

Chr*_*s O 4

ServerStatus应该维护自己的同步,而不是此类的外部客户端。话虽这么说,您需要重构ServerStatus并创建一些线程安全(带锁定)的方法:

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

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

public PistonQueueAdd(string fullPath)
{
    lock(_serverStatusSyncRoot)
    {
        // ...
    }
}
Run Code Online (Sandbox Code Playgroud)