2

可以说我已经声明了一个这样的类:

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 个操作:

  1. 获取实际对象
  2. 设置实际对象
  3. 将对象持久化到文件中
  4. 从文件中检索对象

从并发的角度来看,这是正确的方法吗?考虑到这个类被不同的线程使用,我是否完全处于安全区?

更新 :

对我来说最重要的是,在任何给定时间只有一个线程应该有权访问该对象(无论它想要获取、设置、检索还是持久化它)。考虑到这一点,这是正确的方法吗?会发生任何僵局或其他令人讨厌的事情吗?

4

2 回答 2

4

线程安全是整个系统的属性,而不是单个类或方法的属性。此类实例上的单个操作将独占执行,但也许您需要多个操作是原子的。班级没有办法做到这一点。

那么它是否是线程安全的?只有你能说出来,因为只有你知道这个类是如何被使用的。如果对这个类的操作是真正独立的,那么它是安全的。

如果您所要做的就是获得线程安全的方式来锁定任何类的每个成员,那么线程将是一项简单的任务。线程很复杂,因为它以横切的方式触及所有事物。

于 2013-11-07T16:16:32.120 回答
0

定义“在安全区”。

想象一下使用您的类在多个线程上执行的一段代码

  1. 从文件中读取对象
  2. 修改那个对象
  3. 将该对象写回文件

您在此处所做的任何锁定都不会有助于使该场景成为线程安全的。

于 2013-11-07T16:18:42.167 回答