java執行緒安全問題 靜態變數 例項變數 區域性變數

2021-09-12 03:48:46 字數 1151 閱讀 8435

1. 靜態變數:執行緒非安全。

靜態變數即類變數,位於方法區,為所有物件共享,共享乙份記憶體,一旦靜態變數被修改,其他物件均對修改可見,故執行緒非安全。

public class test implements runnable  

public static void main(string args)

} } **結果:

[執行緒27]獲取static_i 的值:4

[執行緒22]獲取static_i*2的值:20

[執行緒28]獲取static_i 的值:4

[執行緒23]獲取static_i*2的值:8

[執行緒29]獲取static_i 的值:4

[執行緒30]獲取static_i 的值:4

[執行緒31]獲取static_i 的值:4

[執行緒24]獲取static_i*2的值:20

**根據**注釋中模擬的情況,當執行緒1執行了static_i = 4; static_i = 10; 後,執行緒2獲得執行權,static_i = 4;

然後當執行緒1獲得執行權執行static_i * 2; 必然輸出結果4*2=8,按照這個模擬,我們可能會在控制台看到輸出為8的結果。

2. 例項變數:單例模式(只有乙個物件例項存在)執行緒非安全,非單例執行緒安全
public class test implements runnable  

public static void main(string args)

} }

靜態方法是執行緒安全的

先看乙個類

public class  test

}

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

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

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

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

總結:只要方法內含有靜態變數,就是非執行緒安全的

JAVA靜態變數

靜態變數 什麼時候定義靜態變數呢?當該成員變數的值,每乙個物件都一致時,就對該成員變數進行靜態修飾。靜態變數和成員變數的區別 1,所屬範圍不同。靜態變數所屬於類,成員變數所屬物件。靜態變數也稱為 類變數 成員變數也稱為例項變數。2,呼叫不同。靜態變數可以被物件和類呼叫 一般都用類名呼叫 成員變數只能...

JAVA靜態變數

從別處出看來的靜態變數的使用條件,覺得很在理,收藏了。那麼是不是我們應該盡量地多使用靜態變數呢?其實不是這樣的,因為靜態變數生命週期較長,而且不易被系統 因此如果不能合理地使用靜態變數,就會適得其反,造成大量的記憶體浪費,所謂過猶不及。因此,建議在具備下列全部條件的情況下,盡量使用靜態變數 1 變數...

java 靜態變數 與 非靜態變數

一 建立乙個類的物件時 new 類名 時,該類的.class檔案會被載入到一段記憶體中。1.先將該類的.class檔案會被載入到一段記憶體,初始化static屬性和方法,為他們分配空間,以後一直在記憶體中,即使這個物件被銷毀。這就是不建議使用static屬性和方法的原因之一 2.copy其中非sta...