2011-04-29 93 views
3

我在服務器端有一個類。鎖定靜態變量

public class Sample 
{ 
    private enum Status 
    { 
     NotEvaluated, 
     Yes, 
     No 
    } 

    private static object _lockObj = new object(); 
    private static Status _status = Status.NotEvaluated; 

    public static Status GetStatus() 
    { 
     if (_status == Status.NotEvaluated) 
     { 
      lock (_lockObj) 
      { 
       if (_status == Status.NotEvaluated) 
       { 
        //some evaluation code which sets status to either Yes/No; 
        _status = Status.Yes; 
       } 
      } 
     } 

     return _status; 
    } 

} 

上面的鎖定機制有什麼不對嗎?我需要鎖定嗎?因爲它是服務器端的(多個請求將在那裏),並且變量是靜態的,我認爲它應該在評估時被鎖定。

糾正我,如果我錯了。

感謝

回答

2

你不/不應該有 「如果(_status == Status.NotEvaluated)」 外檢查。儘管看起來沒有什麼「不好的」會在你離開它時發生,但第二個線程有可能在第一個線程將_status設置爲Status.Yes之前不必要地輸入「if」。是的,你需要鎖定:

「作爲一個基本規則,你需要鎖定訪問任何可寫的共享字段。」 http://www.albahari.com/threading/part2.aspx

lock (_lockObj) 
    { 
     if (_status == Status.NotEvaluated) 
     { 
      // some evaluation code which sets status to either Yes/No; 
      _status = Status.Yes; 
     } 
     return _status;  
    } 
+4

我猜OP試圖通過時,他知道他沒有不鎖進行優化,但鎖()是相當輕巧的 - 這是不是你需要做的優化。 – DanTheMan 2011-06-30 16:20:50