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

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

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

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

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

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

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

先看一個類:架構

1 public class Test
2 {
3    public static String hello(String str)
4    {
5        String tmp = "";
6        tmp = tmp + str;
7        return tmp;
8    }
9 }

hello方法會不會有多線程安全問題呢?沒有!spa

靜態方法若是沒有使用靜態變量,則沒有線程安全問題。
爲何呢?由於靜態方法內聲明的變量,每一個線程調用時,都會新建立一份,而不會共用一個存儲單元。好比這裏的tmp,每一個線程都會建立本身的一份,所以不會有線程安全問題。
注意:靜態變量,因爲是在類加載時佔用一個存儲區,每一個線程都是共用這個存儲區的,因此若是在靜態方法裏使用了靜態變量,這就會有線程安全問題!線程

相關文章
相關標籤/搜索