Multithreading 静态方法/类上的多线程

Multithreading 静态方法/类上的多线程,multithreading,static,locking,Multithreading,Static,Locking,当线程大量使用静态方法(静态类)时,我们真的需要锁定这些方法吗? 当静态方法使用诸如SQL查询/StoredProcess之类的资源时,是否需要它 谢谢 Pankaj这完全取决于静态方法在做什么。如果他们正在使用共享资源(例如,相同的SQL连接或修改共享集合),那么是的,您绝对需要锁定或类似的东西 但是,如果每个方法调用实际上是独立的,不涉及任何共享的可变状态,则不需要任何锁定。这完全取决于静态方法在做什么。如果他们正在使用共享资源(例如,相同的SQL连接或修改共享集合),那么是的,您绝对需要锁

当线程大量使用静态方法(静态类)时,我们真的需要锁定这些方法吗? 当静态方法使用诸如SQL查询/StoredProcess之类的资源时,是否需要它

谢谢
Pankaj

这完全取决于静态方法在做什么。如果他们正在使用共享资源(例如,相同的SQL连接或修改共享集合),那么是的,您绝对需要锁定或类似的东西


但是,如果每个方法调用实际上是独立的,不涉及任何共享的可变状态,则不需要任何锁定。

这完全取决于静态方法在做什么。如果他们正在使用共享资源(例如,相同的SQL连接或修改共享集合),那么是的,您绝对需要锁定或类似的东西


但是,如果每个方法调用实际上是独立的,不涉及任何共享的可变状态,则不需要任何锁定。

如果跨线程共享内存(静态或非静态),并且依赖此状态信息,则可能会发生争用情况,导致难以调试的问题和错误的执行。

如果跨线程(静态或非静态)共享内存并依赖此状态信息,则可能会发生争用情况,导致难以调试的问题和错误的执行。

静态方法只执行一个存储过程,读取一个或两个表并返回标量值。我用2000个线程的线程池测试了我的方法。它工作正常,但当代码被移动到实时生产时,我收到以下错误“超时已过期。在从池中获取连接之前超时时间已过。这可能是因为所有池连接都在使用,并且达到了最大池大小。”我的方法-静态无效sting GetValueforAccount(long AccountId){lock(object){string value=ExecuteStoredProcedure();返回值;}} Thnx@Panks:你为什么在那里锁定?这意味着你的连接池基本上是无用的-当你可以舒适地使用大量连接时,你最终只能使用一个连接。连接仍然不足的事实表明你可能没有关闭连接(即,将其返回到连接池)当你执行存储过程时。嗨,Jon,你是对的,这在理论上是没有意义的。它会减慢线程的速度。我已经移除了锁。我现在正在使用Block创建SqlConnection和SqlCommands。这样我就不必担心显式关闭连接。它现在可以工作静态方法只需执行读取的存储过程s一个或两个表并返回标量值。我使用2000个线程的线程池测试了我的方法。它工作正常,但当代码移动到实时生产时,我得到以下错误“超时已过期。从池中获取连接之前已过超时时间。这可能是因为所有池连接都在使用,并且达到了最大池大小。”my Method-static void sting GetValueforAccount(long AccountId){lock(object){string value=ExecuteStoreProcedure();返回值;} Thnx@Panks:你为什么在那里锁定?这意味着你的连接池基本上是无用的-当你可以舒适地使用大量连接时,你最终只能使用一个连接。连接仍然不足的事实表明你可能没有关闭连接(即,将其返回到连接池)当你执行存储过程时。嗨,Jon,你是对的,这在理论上是没有意义的。它会减慢线程的速度。我已经移除了锁。我现在正在使用Block创建SqlConnection和SqlCommands。这样我就不必担心显式关闭连接。它现在可以工作静态方法只需执行读取的存储过程s一个或两个表并返回标量值。我使用2000个线程的线程池测试了我的方法。它工作正常,但当代码移动到实时生产时,我得到以下错误“超时已过期。从池中获取连接之前已过超时时间。这可能是因为所有池连接都在使用,并且已达到最大池大小。“我的方法-静态无效sting GetValueforAccount(long AccountId){lock(object){string value=ExecuteStoreProcedure();返回值;}Thnx–Pankstatic方法只执行一个存储过程,该过程读取一个或两个表并返回标量值。我使用2000个线程的线程池测试了我的方法。它工作正常,但当代码移动到实时生产时,我得到了以下错误“超时已过期。从池中获取连接之前已过超时时间。这可能是因为所有池连接都在使用,并且达到了最大池大小。“我的方法-静态无效sting GetValueforAccount(long AccountId){lock(object){string value=ExecuteStoreProcedure();返回值;}}Thnx–Panks