簡體   English   中英

與靜態類的比賽條件?

[英]Race Condition with Static Class?

假設我有一個帶有靜態方法的靜態類。

多個線程可以同時調用此靜態方法。

在以下情況下是否存在比賽條件的可能性:

 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-是的。 這些靜態成員將由所有調用該方法的線程共享。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM