具有静态类的竞争条件?

假设我有一个带静态方法的静态类。

多个线程可以同时调用此静态方法。

在这些情况下是否存在竞争条件:

a - if the method depends only on local variables b - if the method depends on local variables and member fields 

假设我有一个带静态方法的静态类。 多个线程可以同时调用此静态方法。

好。

在这些情况下是否存在竞争条件的可能性:a – 如果该方法仅取决于局部变量

是的,有潜在的竞争条件。

b – 如果方法依赖于局部变量和成员字段

是的,有潜在的竞争条件。

(a)和(b)的答案是更一般规则的结果,即, 无论何时从多个线程调用任何方法, 总是存在竞争条件的可能性。 例如,这个程序死锁:

 class MyClass { static MyClass() { // Let's run the initialization on another thread! var thread = new System.Threading.Thread(Initialize); thread.Start(); thread.Join(); } static void Initialize() { } static void Main() { } } 

它没有字段,两个绝对没有的方法,以及只能在一个线程上访问的单个局部变量。 然而,它立即一直陷入僵局。 (您明白为什么?有关此计划的更多信息,请参阅http://ericlippert.com/2013/01/31/the-no-lock-deadlock/ 。)

如果您的静态方法不访问字段,听起来您正在寻找保证您的程序是线程安全的。 没有这样的保证。 当且仅当您将程序写为线程安全时,您的程序才是线程安全的。

首先,方法只是驻留在地址的一段代码。 调用方法的每个线程都将拥有该方法的副本及其本地变量在其自己的私有堆栈上。 所以如果a,如果没有其他捕获, 它应该是线程安全的

案例b取决于很多因素:

  • 你实际上访问这些成员变量?
  • 你是如何访问它们的:只读,读,写等。
  • 什么样的成员变量:数据结构,单个值。
  • 你有任何同步吗?
  • 等等

但一般来说,假设您确实访问了类成员, 则不应将其视为线程安全的

A – 否。竞争条件仅在静态方法尝试访问共享资源时发生。 局部变量对于调用该方法的每个线程都是唯一的。

B – 是的。 这些静态成员将由调用该方法的所有线程共享。