锁定多线程App C#

时间:2013-11-07 16:14:09

标签: c# multithreading thread-safety locking

让我们说我已经宣布了这样一个类:

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. 从文件中检索对象
  5. 并发的角度来看,这是正确的方法吗?考虑到这个类被不同的线程使用,我是否完全处于安全区域?

    更新:

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

2 个答案:

答案 0 :(得分:4)

线程安全是整个系统的属性,而不是单个类或方法的属性。对此类实例的单独操作将独占执行,但您可能需要多个操作才能成为原子操作。班级无法做到这一点。

它是否是线程安全的?只有你可以告诉,因为只有你知道如何使用这个类。如果这个类的操作是真正独立的,那么它是安全的。

如果您只是为了获得线程安全方式来锁定任何类的每个成员,那么线程将是一项简单的任务。线程很复杂,因为它以交叉方式触及所有内容。

答案 1 :(得分:0)

定义“在安全区内”。

想象一下使用你的类

在多个线程上执行的一段代码
  1. 从文件中读取对象
  2. 修改该对象
  3. 将该对象写回文件
  4. 您在此处执行的任何锁定都不会有助于使该场景具有线程安全性。