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

本文关键字:其他 线程 请求 对象 静态 获取 | 更新日期: 2023-09-27 18:10:42

看完这篇文章后,我对"锁"机制有点困惑,或者只是从根本上对请求感到困惑。

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

假设静态/常量变量不能被多个请求访问,当我们锁定(someelockobject)时,它不应该阻塞其他请求,因为"锁定"获得与该对象相关的排他锁。再一次,那个对象(即。someelockobject)对于我假设的所有请求都是不同的。

这个答案,以及其他一些答案,暗示我在某些事情上错了。如果"锁"只阻塞临界区,这意味着所有在"锁"代码块中执行同一段代码的线程,那么我们为什么要阻塞一个对象呢?我自己可能没多大意义

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

你的困惑源于你最初的假设:

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

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

常量值更具有全面性:引用const值实际上会在编译代码中产生一个文字常量。例如:

Console.WriteLine(3);

…生成与

完全相同的代码
Console.WriteLine(Numbers.Three);

…给定这样一个类:

public class Numbers { public const int Three = 3; }
Are static variables of a given class accessible to all requests (

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

是的,它们对所有请求都是可访问的,如果你声明静态变量,你可能会得到相当讨厌的bug/不一致的行为。

你可以在类中使用静态方法,但我的观点是你应该在方法中声明变量,这样它们就不是静态的,并且对于当前线程来说是局部的。

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

因为你最初的假设是错误的,上面的陈述也是错误的,因为如果你锁定(someObjectLock),它会阻塞其他线程,直到当前线程持有锁释放它。