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()
之间存在差异吗?
答案 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