我有在多个线程中共享的单例类。为了防止多次访问问题,我在访问类的一个或另一个属性时使用 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/