静态功能需要锁定机制吗?

Pra*_*ind 11 c# multithreading

我创建了一个包含5个静态函数的CommonUtils.cs文件(因此我可以将这个.cs复制到Visual Studio中的其他项目,因为我开发了不同的C#应用​​程序)以及我有很多源文件.

现在,我已将我的项目编译为DLL.此DLL由IIS服务器作为应用程序托管.许多客户使用此dll执行某些操作,比如他们生成报告.

我被告知在这种情况下不能慷慨地使用"静态函数"它们应该被应用,一个"锁定"机制,因为没有锁定,单个程序实例的多个线程或程序的多个实例,都可以表现不料.这是真的吗?

Chr*_*tos 11

我被告知在这种情况下不能慷慨地使用"静态函数"它们应该被应用,一个"锁定"机制,因为没有锁定,单个程序实例的多个线程或程序的多个实例,都可以表现不料.这是真的吗?

让我们一块一块地打破它.什么是静态类?

静态类与非静态类基本相同,但有一个区别:静态类无法实例化.换句话说,您不能使用new关键字来创建类类型的变量.因为没有实例变量,所以可以使用类名本身访问静态类的成员.

CLR如何处理静态类?

与所有类类型的情况一样,当加载引用该类的程序时,.NET Framework公共语言运行库(CLR)会加载静态类的类型信息.程序无法准确指定何时加载类.但是, 保证 在程序中 一次引用类之前,可以加载并初始化其字段并调用静态构造函数.静态构造函数只调用一次,静态类在 程序所在应用程序域的生命周期内保留在内存中.

为什么我们可能需要锁定?

基本上,当我们有竞争条件时需要锁定.当有人可能读取其他人可能在同一时间改变他们的数据.两个独立的线程可以访问共享资源,并且没有任何机制可以阻止这种情况.为了回答你的问题,你首先要回答另一个问题.

您的静态方法是否访问共享资源并且可能存在任何竞争条件?如果这是真的,那么你需要使用锁定.否则,不需要它.

有关静态类的更多信息,请查看此处.如果您需要有关线程同步技术的更多信息,请在此处查看.

  • @PrasathGovind然后定义你需要在读取文件内容时使用锁定语句. (2认同)

usr*_*usr 9

函数是不可变的,因此在调用函数时不需要同步.函数参数是可变的,但每次调用都有自己的本地副本.无需同步.

当多个线程处理相同数据并且至少有一个编写器时,需要同步.这是关于线程之间共享的任何变量.需要注意静态变量和静态变量可以访问的任何实例变量.

  • "函数参数是可变的,但每次调用都有自己的本地副本." 我认为这有点误导.是的,每个函数都有一个引用类型的引用副本,但每个副本都指向相同的数据. (5认同)
  • @KennethK.这与函数参数无关.这始终适用.保持引用的变量独立于它指向的对象.了解参考和对象之间的差异是预期的基本知识. (4认同)