让我们说我已经宣布了这样一个类:
public class PersistableObject<TObject> where TObject : class, new()
{
private readonly object objectLocker = new object();
private TObject persistableObject;
public TObject Object
{
get
{
lock (this.objectLocker)
{
return this.persistableObject;
}
}
set
{
lock (this.objectLocker)
{
this.persistableObject = value;
}
}
}
public bool Persist()
{
lock (this.objectLocker)
{
// Do Persist Object in file
}
}
public bool Retrieve()
{
lock (this.objectLocker)
{
// Do Retrieve Object from file
}
}
}
此类负责存储任何类型的变量,将其保存到文件中并从文件中检索它。
如您所见,我使用相同的锁(一个对象)来锁定4个操作:
从并发的角度来看,这是正确的方法吗?考虑到这个类被不同的线程使用,我是否完全处于安全区域?
更新:
对我来说最重要的是,在任何给定时间只有一个线程可以访问该对象(无论它想要获取,设置,检索还是持久化)。考虑到这一点,这是正确的方法吗?任何僵局或其他令人讨厌的事情会发生吗?
答案 0 :(得分:4)
线程安全是整个系统的属性,而不是单个类或方法的属性。对此类实例的单独操作将独占执行,但您可能需要多个操作才能成为原子操作。班级无法做到这一点。
它是否是线程安全的?只有你可以告诉,因为只有你知道如何使用这个类。如果这个类的操作是真正独立的,那么它是安全的。
如果您只是为了获得线程安全方式来锁定任何类的每个成员,那么线程将是一项简单的任务。线程很复杂,因为它以交叉方式触及所有内容。
答案 1 :(得分:0)
定义“在安全区内”。
想象一下使用你的类
在多个线程上执行的一段代码您在此处执行的任何锁定都不会有助于使该场景具有线程安全性。