锁定抽象类中的静态或实例变量

时间:2014-10-14 07:59:39

标签: c# static thread-safety locking abstract-class

public abstract BaseClass
{
    private static readonly object _filelockStatic = new object();
    private readonly object _filelock = new object();

    public void StaticLock()
    {
        lock(_filelockStatic)
        {
             //Edit a common text file (common to all children)
        }
    }

    public void InstanceLock()
    {
        lock(_filelock)
        {
             //Edit a common text file (common to all children)
        }
    }
}

如果我有一个带有编辑文本文件的方法的抽象类(所有子类实例共有的一个文本文件),为了使其成为线程安全,我是否必须锁定静态成员或者无关紧要?

换句话说,上面示例代码中的在线程安全方面InstanceLock()StaticLock()之间存在差异吗?

1 个答案:

答案 0 :(得分:3)

有一点不同,因为InstanceLock会让两个派生类实例同时编辑文件。这是因为实例之间不共享锁。首选静态锁,因为只要你在the same app domain

,它就会阻止任何派生类从不同的线程进入lock(_filelockStatic)区域
var o1 = new DerivedClass();
var o2 = new DerivedClass();

// o1._filelock != o2._filelock 
// o1._filelockStatic == o2._filelockStatic