C#-多线程-如何应用于具有读/写属性的对象
我不熟悉C#中的多线程。但是通过阅读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;
public class Test
{
private string property1;
public string ClassProperty
{
get
{
lock
{
return Property1;
}
}
set
{
lock
{
Property1 = value;
}
}
}
}
我知道,在类中声明和使用任何共享变量时,都需要在多线程应用程序中锁定它。但我读过的一些文章建议,如果所公开的属性是引用类型,则上述代码将不起作用。其他人建议您不能使具有公开属性的类成为线程安全的?有人对这个问题有明确的答案吗
谢谢引用类型的问题是,您只锁定了获取引用。在引用了该类型后,可以以不安全的方式访问该类型的成员,除非该类型本身支持线程安全。该代码示例除了增加开销之外,什么都不做。C#字符串对象本身是线程安全的,指针读/写总是原子的。该代码示例仅对double或struct有意义 您不应该考虑使单个属性成为线程安全的,而应该考虑使更大的逻辑操作成为“原子的”。例如,如果您有两个字段foo和bar,并且必须始终是bar==小写(foo),那么您应该保护使用相同锁访问其中任何一个字段的操作 更好的示例是必须同时包含在向量和哈希中的对象:
- 添加时,应同时锁定向量和散列,并在锁定下更新两者李>
- 查询时,您应该锁定散列,获取值,解锁并返回它
- 迭代时,您应该返回向量的副本,或者确保调用方理解您的锁定模式