获取静态对象的锁应该阻塞其他请求线程?

时间:2011-10-06 23:46:11

标签: c# asp.net asp.net-mvc

所以在阅读this之后,我对“锁定”机制感到有点困惑,或者只是对请求的根本混淆。

给定类的静态变量是否可供所有请求访问(假设一台服务器)?据我所知,他们不是。

假设静态/常量变量不能被多个请求访问,当我们锁定(someLockObject)时,它不应该阻止其他请求,因为“lock”获得与该对象关联的独占锁。同样,在我假设的情况下,该对象(即someLockObject)对于所有请求都是不同的。

This回答,以及其他一些回答,暗示我对某事有误。如果“锁定”只阻止那个关键部分,意味着所有线程在“锁定”代码块中执行同一段代码,那么为什么我们必须阻塞一个对象呢?我自己可能没有多大意义。

2 个答案:

答案 0 :(得分:4)

您的混淆源于您最初的假设:

  

给定类的静态变量是否可供所有请求访问(假设一台服务器)?据我所知,他们不是。

特定类的静态字段对于整个应用程序域中的每个线程中的每个实例都是相同的。出于实际目的,在一个服务器实例上,这基本上意味着在所有请求中共享static字段。

常量值更加全局:引用const值实际上会在编译代码中生成一个文字常量。例如:

Console.WriteLine(3);

...生成完全相同的代码:

Console.WriteLine(Numbers.Three);

......给出这样的课程:

public class Numbers { public const int Three = 3; }

答案 1 :(得分:2)

Are static variables of a given class accessible to all requests (
     

假设一台服务器)?据我所知,他们不是。

是的,所有请求都可以访问它们,如果声明静态变量,则可能会遇到相当糟糕的错误/不一致行为。

你可以在一个类中使用静态方法,但我认为你应该在方法中声明你的变量,这样它们就不是静态的,而是当前Thread的本地变量。

  

并假设静态/常量变量不是   当我们锁定(someLockObject)它时,可以访问多个请求   不应该阻止其他请求,因为“lock”获得了独占权   与该对象关联的锁定。再一次,那个对象(即。   someLockObject)对于我假设的所有请求都是不同的

由于你的初始假设是错误的,因此如果你锁定(someObjectLock)它将阻止其他线程,直到当前线程持有锁释放它为止,上面的语句也是错误的。