c# - 使自定义对象线程安全

标签 c# .net multithreading

我发布了一个 earlier question关于返回集合,线程安全的话题出现了。我得到了这个 link做更多的阅读,我发现了这一行:

In general, avoid locking on a public type, or instances beyond your code's control.

首先,如果我错了请纠正我,但是 Microsoft 给出的锁定公共(public)类型 balance 变量的示例不是吗?

其次,我将如何锁定我自己的 getter/setter 属性。假设我有以下类(class):

private int ID;

public Person(int id)
{
    this.Identification= id;

}

public int Identification
{
    get { return this.ID; }

    private set
    {
        if (value == 0)
        {
            throw new ArgumentNullException("Must Include ID#");
        }
        this.ID = value;
    }
}

setter/getter 是公开的吗?只有 setter 被声明为私有(private)。那么,我将如何锁定或使我的 getter/setter 属性线程安全?

最佳答案

你应该像这样在 Person 类中定义一个变量

private readonly object _lock_ = new Object();

如果你想对 Person 的所有实例进行同步,你应该将其设为 static

然后当你想加锁的时候你可以这样做

lock(_lock_) //whose there? it's me, I kill you! oops sorry that was knock knock
{
    //do what you want
}

我建议你阅读这篇文章:1

关于c# - 使自定义对象线程安全,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30734830/

相关文章:

c - 多线程标准输出在每次执行时写入不同的内容

另一个线程正在运行时,JavaFX UI 被阻塞

java - 检查 `ReentrantReadWriteLock` 中是否拥有 readLock

c# - 在为单元测试创​​建模拟时,我们是否在自欺欺人?

c# - 在属性中声明变量是否被认为是不好的做法?

c# - Xamarin iOS 在点击时隐藏占位符

.net - Heroku 应用程序在 TLS v1.0/1.1 生命周期结束后无法使用 https

c# - 有更好的方法吗: Joins on different Datatables?

c# - 无法读取 X509Certificate2 上的私钥

.net - 是否有 .net 框架方法可以根据集合中所有项目的属性生成集合?