繁体   English   中英

锁定多线程App C#

[英]Lock in multithreaded App C#

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

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. 从文件中检索对象

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

更新:

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

线程安全性是整个系统的属性,而不是单个类或方法的属性。 此类的实例上的单个操作将排他地执行,但是您可能需要多个操作才能成为原子操作。 该班没有办法做到这一点。

那么它是线程安全的吗? 只有您能说出来,因为只有您知道如何使用该类。 如果此类的操作确实是独立的,那么它是安全的。

如果您已采取一切措施来获取仅锁定任何类的每个成员的线程安全方式,那么线程化将是一项简单的任务。 线程很复杂,因为它以交叉方式接触所有内容。

定义“在安全区域中”。

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

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

您在此处进行的任何锁定都不会帮助使该方案成为线程安全的。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM