2017-02-23 100 views
1

我有一個方法如下:競爭條件在靜態方法中

public static void method() { 

int i = 0; 
i = i + 1; 

} 

我有一個靜態方法中的int變量。該方法由多個線程訪問。
我的問題是:

  1. 是否i變量這場比賽的條件?
  2. 如果在春季Web應用程序中訪問並同時由多個用戶訪問該方法,該怎麼辦?
+0

參考這個http://stackoverflow.com/q/17343157/2809326 – arjun

+1

@ElliottFrisch它不是一個線程本地,它是一個堆棧變量。 (區別在於它是可重入的。) – chrylis

回答

6

如果該變量是在方法中聲明的,那麼它就存在於提供給方法的單個調用的棧幀中。只有調用該方法的線程才能訪問堆棧幀。在發佈的示例中沒有競爭條件,每個方法的調用都獲得它自己的變量副本。你需要共享狀態纔能有競爭狀態。

這些堆棧幀是執行遞歸方法時堆積起來的東西,並佔用堆棧空間,直到發生某個堆棧溢出錯誤,因爲遞歸導致越來越多的堆棧幀被分配,而沒有任何方法調用有機會完成(這將釋放他們的堆棧空間)。