在多執行緒中使用靜態方法是否有執行緒安全問題

2021-08-01 10:59:32 字數 1010 閱讀 7232

在多執行緒中使用靜態方法是否有執行緒安全問題

類的成員分為兩類,靜態成員(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)來訪問資料庫.

先看乙個類:

public class test }

hello方法會不會有多執行緒安全問題呢?沒有!

靜態方法如果沒有使用靜態變數,則沒有執行緒安全問題。

為什麼呢?因為靜態方法內宣告的變數,每個執行緒呼叫時,都會新建立乙份,而不會共用乙個儲存單元。比如這裡的tmp,每個執行緒都會建立自己的乙份,因此不會有執行緒安全問題。

注意:靜態變數,由於是在類載入時占用乙個儲存區,每個執行緒都是共用這個儲存區的,所以如果在靜態方法裡使用了靜態變數,這就會有執行緒安全問題!

在多執行緒中使用靜態方法是否有執行緒安全問題

類的成員分為兩類,靜態成員 static member 和例項成員 instance member 靜態成員屬於類,例項成員則屬於物件,即類的例項。簡單討論一下在乙個類中使用靜態字段 static field 和靜態方法 static method 是否會有執行緒安全問題。我們在知道,靜態字段 st...

在多執行緒中使用靜態方法是否有執行緒安全問題

類的成員分為兩類,靜態成員 static member 和例項成員 instance member 靜態成員屬於類,例項成員則屬於物件,即類的例項。簡單討論一下在乙個類中使用靜態字段 static field 和靜態方法 static method 是否會有執行緒安全問題。我們在知道,靜態字段 st...

在多執行緒中使用靜態方法是否有執行緒安全問題

類的成員分為兩類,靜態成員 static member 和例項成員 instance member 靜態成員屬於類,例項成員則屬於物件,即類的例項。簡單討論一下在乙個類中使用靜態字段 static field 和靜態方法 static method 是否會有執行緒安全問題。我們在知道,靜態字段 st...