1. 程式人生 > >在多線程中使用靜態方法是否有線程安全問題

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

類加載 通過 style 問題 string write 客戶端訪問服務器 asp 成員

 類的成員分為兩類,靜態成員(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方法會不會有多線程安全問題呢?沒有!

靜態方法如果沒有使用靜態變量,則沒有線程安全問題。
為什麽呢?因為靜態方法內聲明的變量,每個線程調用時,都會新創建一份,而不會共用一個存儲單元。比如這裏的tmp,每個線程都會創建自己的一份,因此不會有線程安全問題。
註意:靜態變量,由於是在類加載時占用一個存儲區,每個線程都是共用這個存儲區的,所以如果在靜態方法裏使用了靜態變量,這就會有線程安全問題!

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