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

C#-多线程-如何应用于具有读/写属性的对象,c#,multithreading,thread-safety,C#,Multithreading,Thread Safety,我不熟悉C#中的多线程。但是通过阅读C#书籍和教程中的各个章节。我知道开发多线程应用程序中使用的类的最佳方法是创建不可变类 但我不太确定如何处理公开读/写属性的类。在我读过的一些文章中,作者在读/写属性周围放置了锁,例如 public class Test { private string property1; public string ClassProperty { get { lock { return Property1;

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

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

public class Test
{
  private string property1;

  public string ClassProperty
  {
   get
   {
     lock 
     {
       return Property1;
     }
   }
   set
   {
      lock 
      {
        Property1 = value;
      }
   }
 }
}
我知道,在类中声明和使用任何共享变量时,都需要在多线程应用程序中锁定它。但我读过的一些文章建议,如果所公开的属性是引用类型,则上述代码将不起作用。其他人建议您不能使具有公开属性的类成为线程安全的?有人对这个问题有明确的答案吗


谢谢

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

该代码示例除了增加开销之外,什么都不做。C#字符串对象本身是线程安全的,指针读/写总是原子的。该代码示例仅对double或struct有意义

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

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

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

我建议你阅读这本免费电子书:你从哪里知道不可变类是最好的方法?我可以想象,在一个有状态的多线程应用程序中,不可变类可能是一场噩梦!