本文目錄一覽:
- 1、java static是否是 thread安全的
- 2、Java中關於static成員方法的線程安全問題
- 3、靜態變量,實例變量,局部變量線程安全嗎
- 4、java的類靜態函數都是安全的嗎?
- 5、為什麼在java高並發系統中不建議寫靜態方法
java static是否是 thread安全的
static修飾的變量屬於類變量,在多線程代碼中,有可能多個代碼同時調用一個靜態方法,而這個靜態方法中如果對靜態變量發生了寫操作,在不使用鎖的情況下,就不是線程安全的!
確保線程安全的話,需要給代碼段加鎖,這樣就安全了。
Java中關於static成員方法的線程安全問題
都同時調用了,怎麼還不是多線環境下呢?但是就算是同時調用,如果沒有共享變量,有共享變量,但變量是final(引用類型除外)或者是線程安全類(Concurrent包下的,也可以)就不會存在並發問題。
public
class
TestUtil()
{
private
static
int
i
=
public
static
int
a
(){
return
i++;//會有並發問題
}
public
static
int
b()
{
int
i
=
0;
return
i++;//不會有並發問題
}
}
方法是否存在並發問題,判斷是否有競態條件就好了
靜態變量,實例變量,局部變量線程安全嗎
1、靜態變量:線程非安全。
靜態變量即類變量,位於方法區,為所有對象共享,共享一份內存,一旦靜態變量被修改,其他對象均對修改可見,故線程非安全。
2、實例變量:單例模式(只有一個對象實例存在)線程非安全,非單例線程安全。
實例變量為對象實例私有,在虛擬機的堆中分配,若在系統中只存在一個此對象的實例,在多線程環境下,“猶如”靜態變量那樣,被某個線程修改後,其他線程對修改均可見,故線程非安全;如果每個線程執行都是在不同的對象中,那對象與對象之間的實例變量的修改將互不影響,故線程安全。
3、局部變量:線程安全。
每個線程執行時將會把局部變量放在各自棧幀的工作內存中,線程間不共享,故不存在線程安全問題。
靜態方法是線程安全的
java的類靜態函數都是安全的嗎?
只要不使用全局變量的都是安全的。如果使用全局變量,就要有對應的處理,例如鎖,例如localthread。
為什麼在java高並發系統中不建議寫靜態方法
因為靜態方法是屬於類本身的,高並發下不能保證線程安全,所以不建議寫靜態方法
原創文章,作者:NMFZ,如若轉載,請註明出處:https://www.506064.com/zh-hant/n/146358.html