静态方法是否共享其本地变量以及在不同线程的并发使用期间会发生什么?

C#问题 – 我试图确定是否可以使用静态方法,在方法中它确实使用了一些局部变量。 局部变量是否在方法的使用中“共享”? 例如,如果从不同的线程同时调用/使用静态方法会发生什么? 一个线程阻塞,直到另一个线程完成等吗?

也许通用的问题是,在线程应用程序中,何时“不”使用静态方法?

方法中的局部变量存在于堆栈中,每个线程都有自己的堆栈。 因此,multithreading使用该方法是安全的。

但是,如果方法本身使用静态变量,那么您应该使用适当的MT保护。 您可能正在调用的外部方法也需要安全……

局部变量是否在方法的使用中“共享”?

不,他们不是。 执行该方法的每个线程都有自己的局部变量副本,它们彼此独立。 当该方法返回时,将丢弃该特定线程的本地的特定副本。 (*)

例如,如果从不同的线程同时调用/使用静态方法会发生什么? 一个线程阻塞,直到另一个线程完成等吗?

不,他们没有; 他们只会在两个独立的堆栈上同时执行该方法。 如果您确实希望它们阻塞,请使用lock语句 ,这会导致进入lock语句的第二个线程等到第一个从lock语句返回的线程。 如果您的方法访问(非本地)字段(共享数据),则可能需要这样做。

在线程应用程序中,何时应该使用静态方法?

是否应该使用静态方法取决于方法是否需要对象进行操作,而与应用程序是否为multithreading无关。 出于线程的目的,与非静态方法相比,静态方法没有什么特别之处。

(*)如果在使用局部变量的方法中有lambda表达式或匿名方法,则可能不再适用,但这是技术性的。

C#中没有任何类型的方法共享局部变量。

你可能会想到VB中的静态函数。

在multithreading应用程序中使用静态方法有很多理由。 也没有错。 只要你不更改任何全局变量(没有锁定),你应该没有问题。