私はこのように見えるシングルトンクラスを持っています、
public class CfgHandler
{
private static readonly string ConfigDir = "Config";
public T Get<T>() where T : class, new()
{
string cfgFile = Path.Combine(ConfigDir, typeof(T).FullName + ".json");
if (File.Exists(cfgFile))
{
var reader = new JsonReader();
return reader.Read<T>(File.ReadAllText(cfgFile));
}
return null;
}
public void Set<T>(T instance) where T : class, new()
{
string cfgFile = Path.Combine(ConfigDir, typeof(T).FullName + ".json");
var writer = new JsonWriter();
string json = writer.Write(instance);
File.WriteAllText(cfgFile, json);
}
}
このクラスはマルチスレッド環境で使用されており、ロックを追加したいと思います。cfg.Set<Foo>();
ただし、クラス全体で1つのロックではありません。これは、との間で競合状態が発生したくないためですcfg.Set<Bar>()
。
次のクラスをに追加することを考えましたCfgHandler
、
private static class Locks<T>
{
private static object _lock = new object();
public static object Lock { get { return _lock; } }
}
次に、このようにロックします(GetとSetの両方)。
public void Set<T>(T instance) where T : class, new()
{
lock(Locks<T>.Lock)
{
// save to disk
}
}
些細なことを見逃していますか?私の目標を達成するためのより良い方法はありますか?