我一直有这个特定的场景让我担心。假设我的课看起来像这样
public class Person {
public Address Address{get;set;}
public string someMethod()
{}
}
我的问题是,我的开发人员告诉我,Address类型的地址属性不是线程安全的。
从Web请求的角度来看,每个请求都在一个单独的线程上运行 该线程处理我的业务对象或后面的代码中的以下行,例如
var p = new Person();
它在堆上创建一个Person对象的新实例,因此请求线程访问该实例,除非我在我的应用程序中生成多个线程。
如果我错了,请向我解释为什么我错了,为什么公共财产(地址)不是线程安全的?
非常感谢任何帮助。
感谢。
答案 0 :(得分:2)
如果在多个线程之间共享对Person
实例的引用,则多个线程可能会更改Address
导致竞争条件。但是,除非你在静态字段或Session(某种全局可访问的地方)中持有该引用,否则你没有什么可担心的。
如果您正在创建代码中对象的引用,就像上面显示的那样(var p = new Person();
),那么您就完全是线程安全的,因为其他线程将无法访问对这些对象的引用而不诉诸恶意和恶意伎俩。
答案 1 :(得分:1)
您的属性不是线程安全的,因为您没有锁定以防止对属性的多次写入踩到彼此的脚趾。
但是,在您不在多个线程之间共享类实例的情况下,该属性不需要是线程安全的。
在多个线程之间共享的对象,其中每个线程可以更改对象的状态,然后需要保护所有状态更改,以便一次只有一个线程可以修改对象。
答案 2 :(得分:0)
你应该没问题,不过有些事情我会担心......
如果要修改Person对象或保留一些可处理资源,您可能会发现其中一个线程无法读取此变量。为了防止这种情况,您需要在读取/写入之前锁定对象,以确保它不会被其他线程踩踏。最简单的方法是使用lock {}构造。