0

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

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

public class Test
{
  private string property1;

  public string ClassProperty
  {
   get
   {
     lock 
     {
       return Property1;
     }
   }
   set
   {
      lock 
      {
        Property1 = value;
      }
   }
 }
}

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

谢谢

4

2 回答 2

2

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

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

一个更好的例子是一个对象,它必须同时包含在向量和散列中:

  • 添加时,您应该锁定向量和散列并在锁定下更新两者。
  • 查询时,您应该锁定哈希,获取值,解锁并返回它。
  • 迭代时,您应该返回向量的副本或确保调用者理解您的锁定模式。
于 2012-11-16T11:30:23.103 回答
0

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

于 2012-11-16T11:19:44.663 回答