多執行緒中靜態方法的執行緒安全問題

2021-09-12 15:03:43 字數 1010 閱讀 8960

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

類的成員分為兩類,靜態成員(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,每個執行緒都會建立自己的乙份,因此不會有執行緒安全問題。

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

**

多執行緒中的執行緒安全問題

問題描述 某段 在沒有執行完成的時候,cpu就可能被其他執行緒搶走,結果導致當前 中的一些資料發生錯誤 原因 沒 某段 的執行的完整性 原子性 希望 這段 要麼全都執行,要麼全都沒有執行 前面模擬售票的都是執行緒安全問題 同步 塊 使用一種格式,達到讓某段 執行的時候,cpu不要切換到影響當前 的 ...

多執行緒(多執行緒的安全問題)

多執行緒的執行出現安全問題。非常可怕的問題,一出問題比較惱火 問題原因 重點 當多條語句在操作同乙個執行緒共享資料時,乙個執行緒對多條語句只執行了一部分,還沒執行完,另乙個執行緒參與進來執行。導致共享資料的錯誤。解決方法 對多條操作共享資料的語句,只能讓乙個執行緒都執行完,在執行過程中,其他執行緒不...

多執行緒安全問題

這裡的安全問題可以理解為 實現在邏輯上的問題,比如 火車站賣票 100張票讓4個人去賣,一定不能出現賣的票是負數問題,那麼開啟多執行緒後,如何才能保證賣的票不可能存在負數呢?常用的解決方法有兩種 1,使用同步 塊,把需要同步的 再放同步 塊中 2,使用同步函式 同步的鎖,可以理解為就是那個物件!同步...