如果w3wp.exe是负责处理Web应用程序的所有传入请求的进程(如果我错了,请更正我),如果我有一个类,让我们称之为客户这样
public class Customer
{
public string FirstName{get;set;}
public string LastName{get;set;}
}
所以现在在这样的代码中访问这个类
var customer = new Customer();
在堆中创建实例,并且w3wp.exe中运行的所有线程都可以访问客户对象的FirstName和LastName属性。
那么,在这种情况下,FirstName和LastName属性是不是线程安全的吗?使用仅属于特定实例且线程安全的私有属性是否明智?
答案 0 :(得分:3)
虽然编译器为自动属性创建了一个支持字段,但它不会在其上创建任何同步。
至于线程安全性 - 它取决于你在线程中对这个类的对象做了什么。如果每个线程有一个不同的对象,没问题。
如果您从许多线程访问相同的对象(即共享资源),情况会有所不同:
如果你正在做的只是读取一个值而不是设置来自多个线程,那么没有问题。
如果您从多个线程修改对象,则可能会出现问题。 将需要同步,您可以在线程代码中添加。
答案 1 :(得分:0)
正如Oded指出的那样,通常情况良好。但是,如果您担心线程问题,请不要让编译器为您创建支持字段,而是自己写出来为它添加前缀volatile。该应用程序将为此支付性能损失。
如果您真的担心线程,可以在分配时使用this method手动将它们联系起来。
我见过的最佳实践是在我的代码中使用简单的lock
代码+ volatile
前缀,这些变量在多线程上下文中出现。使用这种技术从未遇到过问题。
答案 2 :(得分:-1)
您没有关于工作进程如何工作的概念。基本上,每个线程都会创建一个新的类实例。实际上,你的类不需要是线程安全的,事实上它不是线程安全的。
为了清楚起见,您对私有/公共领域和线程安全的理解并不完全正确(我不相信)。因此,在这种情况下,你不应该将它们视为这样。
在堆中创建一个实例 所有线程都在中运行 w3wp.exe可以访问这些属性 客户的FirstName和LastName 对象
不,不是所有的主题。每个线程都将获得它自己的实例。我假设您在页面或控制器中创建了客户实例?可以这样想一想,您的应用程序收到的每个请求都是一个线程,因为对于每个请求,都会创建一个新的页面(或控制器)实例,您在页面或控制器中创建的任何对象也都特定于该线程,因此在大多数情况下,你是安全的。当然,如果您正在做一些您未提及的事情,或者您没有在页面或控制器中创建客户对象的实例,那么在您得到答案之前,需要回答各种其他问题/场景。< / p>
我在我的博客上写了一篇文章,解释了这一切是如何运作的。这篇文章的目的不同,但我相信你将在那里学到的东西将帮助你更好地掌握IIS和Worker进程的工作方式以及它们如何与你的ASP.NET应用程序交互。