Multithreading, general blocking

I have a singleton class that is very similar to this one,

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);
    }
}

The class is used in a multi-threaded environment, and I want to add locks. But not one lock for the whole class, since I do not want the conditions of the race between cfg.Set<Foo>();and cfg.Set<Bar>(), since they work with different data.

I was thinking of adding the following class to CfgHandler,

private static class Locks<T>
{
    private static object _lock = new object();
    public static object Lock { get { return _lock; } }
}

and then block like this (for both Get and Set),

public void Set<T>(T instance) where T : class, new()
{
    lock(Locks<T>.Lock)
    {
        // save to disk
    }
}

Am I missing something trivial? Is there a better way to achieve my goal?

+3
source share
2 answers

Instance lock or lock for each type?

, ( Locks<T>.Lock), , Set<Foo> CfgHandler . , ? , - Locks<T>. (private object _lock = new object();) (lock(this._lock))

CfgHandler , , , . , , , Locks<T> , .

+5

. :

, , , , Set<T>(T Instance) . , , API. , , writer.write(instance), , , , .

Get, . , ? .

+2
source

All Articles