C# - 多线程处理 - 如何应用于具有读/写属性的对象



我是C#多线程的新手。但是通过阅读 C# 书籍和教程中的各种章节。我知道开发多线程应用程序中使用的类的最佳方法是创建不可变的类。

但是我不太确定如何处理公开读/写属性的类。在我读过的一些文章中,作者在读/写属性周围放置了锁,例如

public class Test
{
  private string property1;
  public string ClassProperty
  {
   get
   {
     lock 
     {
       return Property1;
     }
   }
   set
   {
      lock 
      {
        Property1 = value;
      }
   }
 }
}

我知道,对于在类中声明和使用的任何共享变量,都需要将其锁定在多线程应用程序中。但是我读过的一些文章表明,如果公开的属性是引用类型,则上面的代码将不起作用。其他人建议你不能使具有公开属性的类线程安全?有人对这个话题有明确的答案吗?

谢谢

该代码示例除了增加开销外不执行任何操作。无论如何,C# 字符串对象本身都是线程安全的,指针读/写始终是原子的。该代码示例仅对双精度或结构有意义。

您不应该考虑使单个属性成为线程安全的,而应该考虑使较大的逻辑操作"原子化"。例如,如果您有两个字段 foo 和 bar,并且必须始终是 bar == 小写 (foo) 的情况,那么您应该保护使用相同锁访问其中任何一个的操作。

一个更好的例子是必须同时包含在向量和哈希中的对象:

  • 添加时,您应该同时锁定向量和哈希,并在锁定下更新两者。
  • 查询时,您应该锁定哈希,获取值,解锁并返回它。
  • 迭代时,应返回向量的副本,或确保调用方了解锁定模式。

引用类型的问题是你只锁定了获取引用。在具有对该类型的引用后,您可以以不安全的方式访问类型成员,除非该类型本身支持线程安全。

最新更新