[Software Architecture]Thread Safe

[Software Architecture]Thread Safe

之前在幫人家解一個問題時曾經發現Thread Safe的問題,而這個問題是怎麼發生的呢?其實他的code是這樣寫的,或許你的程式也有類似的寫法,請多多小心:



public static void  functionA()
{
      //操作gGlobal
      gGlobal = "";
}

 

當我們在撰寫static function時,如果想要用到全域變數,如果我們沒有宣告成static的話,compile的時候會出現這個錯誤:

image

 

如果你在看到這個錯誤時沒有多想,就直接將gGlobal改成static的話,compile就過了,而且程式也可以正常的運作了:



public static void  functionA()
{
      //操作gGlobal
      gGlobal = "";
}

 

但我們知道static變數,在程式中如果要操作,應該要進行lock來避免有其他thread同時存取這個變數,但如果你沒做,你就會發現在使用人數較多的web系統上,異常的錯誤就會出現,而且很容易引導你朝向錯誤的方向去找這個問題,你可能會以為是多人連線造成系統錯誤,又或者其他怪問題(EX:兩個Thread相繼讀寫同一個static變數,讀出來的結果卻是對方設定的值,整個錯亂),但其實這個錯誤都是因為Thread Safe的issue了,下面一些不錯的參考資料,可以參考:

Wiki Thread Safety

http://www.odetocode.com/Articles/313.aspx

http://odetocode.com/Articles/314.aspx

 

下面這些物件可能會發生thread safe的狀況,必須要用lock的指令來控制,其實主要就是static或者Application這一類的全域型物件比較容易發生,使用時千萬要小心:

  • Static variables in your WebService class
  • A static reference to a helper class that contains member variables
  • A helper class that contains a static variable
  • the application value collection.

 

下面這些物件不會發生thread safe的狀況,比較特別的是Session,因為它不是單一存在記憶體中的,而是每個User thread 都有一份Session物件:

  • Local variables inside a method
  • Member variables in your WebService class
  • Member variables in a helper class that is local to your method.
  • Member variables in a helper class that is referenced as a member inside your WebService class
  • The user's session. (Session storage appears to be local to the thread)

 

自從遇過這種問題後,當發生詭異問題時,這一類的程式寫法也是我排除問題會看的點,畢竟看過幾次這樣的寫法後發現他實在是容易被忽略。

 

參考資料:

Wiki Thread Safety

http://www.odetocode.com/Articles/313.aspx

http://odetocode.com/Articles/314.aspx

游舒帆 (gipi)

探索原力Co-founder,曾任TutorABC協理與鼎新電腦總監,並曾獲選兩屆微軟最有價值專家 ( MVP ),離開職場後創辦探索原力,致力於協助青少年培養面對未來的能力。認為教育與組織育才其實息息相關,都是在為未來儲備能量,2018年起成立為期一年的專題課程《職涯躍升的關鍵24堂課》,為培養台灣未來的領袖而努力。