在多線程中使用靜態方法是否有線程安全問題(轉載)

原文出處:http://www.cnblogs.com/tiancai/p/5417767.htmlhtml

另一篇描述:https://zhidao.baidu.com/question/394984299357804085.html數據庫

類的成員分爲兩類,靜態成員(static member)和實例成員(instance member)。靜態成員屬於類,實例成員則屬於對象,即類的實例。安全

     簡單討論一下在一個類中使用靜態字段(static field)和靜態方法(static method)是否會有線程安全問題。 服務器

     咱們在知道, 靜態字段(static field)和靜態方法(static method)的調用是經過類來調用。靜態方法不對特定的實例操做,只能訪問靜態成員。實例方法可對特定的實例操做,既能訪問靜態成員,也能訪問實例成員。多線程

     那麼,在多線程中使用靜態方法是否有線程安全問題?這要看靜態方法是否引發線程安全問題,要看在靜態方法中是否使用了靜態成員。

     由於,在多線程中使用同一個靜態方法時,每一個線程使用各自的實例字段(instance field)的副本,而共享一個靜態字段(static field)。因此說,若是該靜態方法不去操做一個靜態成員,只在方法內部使用實例字段(instance field),不會引發安全性問題。可是,若是該靜態方法操做了一個靜態字段,則須要靜態方法中採用互斥訪問的方式進行安全處理。
    
     舉個簡單的例子,咱們使用的Console.WriteLine();中WriteLine()是Console類的靜態方法。

     對於ASP.NET, 多個客戶端訪問服務器端, 這是一個多線程的例子.只要理解了緣由,咱們能夠在三層架構中的數據訪問層中放心使用靜態方法(static method)來訪問數據庫.架構

先看一個類:
public class Test
{
   public static String hello(String str)
   {
       String tmp = "";
       tmp = tmp + str;
       return tmp;
   }
}
hello方法會不會有多線程安全問題呢?沒有!
靜態方法若是沒有使用靜態變量,則沒有線程安全問題。
爲何呢?由於靜態方法內聲明的變量,每一個線程調用時,都會新建立一份,而不會共用一個存儲單元。好比這裏的tmp,每一個線程都會建立本身的一份,所以不會有線程安全問題。
注意:靜態變量,因爲是在類加載時佔用一個存儲區,每一個線程都是共用這個存儲區的,因此若是在靜態方法裏使用了靜態變量,這就會有線程安全問題!
相關文章
相關標籤/搜索