靜態變量、實例變量、局部變量與線程安全


靜態變量:線程非安全。

加static關鍵字的變量,只能放在類里,不能放到方法里

靜態變量有默認初始化值。

靜態變量表示所有實例共享的一個屬性,位於方法區,共享一份內存,而成員變量是對象的特殊描述,不同對象的實例變量被分配在不同的內存空間,一旦靜態變量被修改,其他對象均對修改可見,故線程非安全。

 

實例變量:單例模式(只有一個對象實例存在)線程非安全,非單例線程安全。

成員變量(實例變量):
1、成員變量定義在類中,即類中的普通變量,在整個類中都可以被類中方法所訪問(如過和局部變量重名,需用this關鍵字)。
2、成員變量隨着對象的建立而建立,隨着對象的消失而消失,存在於對象所在的堆內存中
3、成員變量有默認初始化值

實例變量為對象實例私有,在虛擬機的堆中分配,若在系統中只存在一個此對象的實例,在多線程環境下,被某個線程修改后,其他線程對修改均可見,故線程非安全;如果每個線程執行都是在不同的對象中,那對象與對象之間的實例變 量的修改將互不影響,故線程安全。

 

成員變量和類變量的區別:
1、兩個變量的生命周期不同
成員變量隨着對象的創建而存在,隨着對象的回收而釋放。
靜態變量隨着類的加載而存在,隨着類的消失而消失,且優先於對象存在。
2、調用方式不同
成員變量只能被對象調用。
靜態變量可以被對象調用,還可以被類名調用。
3、數據存儲位置不同
成員變量存儲在堆內存的對象中,是對象的特有數據。
靜態變量數據存儲在方法區(共享數據區)的靜態區

static還可以修飾方法,靜態方法只能訪問靜態變量,不可以訪問成員變量,因為靜態方法加載時,優先於對象存在,所以沒有辦法訪問對象中的成員。同時靜態方法中不能使用this,super關鍵字,因為this代表當前對象,而靜態方法在時,有可能沒有對象,所以this無法使用。 

 

 

局部變量:線程安全。
1、局部變量只定義在局部范圍內,如:函數內,for循環語句內等,只在所屬的區域有效。
2、局部變量存在於棧內存中,作用的范圍結束,變量空間會自動釋放。
3、局部變量沒有默認初始化值
4、在使用變量時需要遵循的原則為:就近原則,先找局部變量,再找實例變量(如果同名,實例變量需要用this關鍵字引用)
5、局部變量不能逐級重名,比如函數內定義過一個變量,就不能在for循環內定義相同的變量(兩層for循環一個用i一個用j也是這個道理)

由於每個線程執行時將會把局部變量放在各自棧幀的工作內存中,線程間不共享,故不存在線程安全問題。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM