靜態變數 例項變數 區域性變數 常量以及執行緒安全

2022-07-13 18:33:15 字數 3686 閱讀 6579

靜態變數也稱為類變數,由static關鍵字修飾,在任何方法、建構函式或**塊外部。類變數在程式啟動時被建立,在程式停止時

被銷毀。類變數被儲存在靜態儲存器中。類變數通過類名訪問。

常量,由final關鍵字修飾,靜態變數的特性常量都有,除此之外,常量必須宣告時就被賦值且不能再被改變。常量名一般大寫。常量被儲存在常量儲存器內。

例項變數,宣告在任意方法、建構函式或

**塊外部。在物件「new」時被建立,物件銷毀時被銷毀。例項變數是物件的一部分,同物件一起儲存在堆中。例項變數通過物件訪問。

區域性變數,在方法、建構函式或**塊中宣告。區域性變數在進入方法、建構函式或塊時建立,退出時被銷毀。區域性變數存放在各自棧幀的工作記憶體中。

常量是執行緒安全的

常量一旦宣告就禁止修改,所以是執行緒安全的。

靜態變數(類變數)不是執行緒安全的

單例(非執行緒安全)

import org.junit.test;

public class threadsafety implements runnable catch (interruptedexception e)

count = 10;

system.out.println("[" +thread.currentthread().getname()+"] 獲取的count 值為 "+count );

}@test

public void test()

}}

本應輸出的count全部為10,但是根據結果表明靜態變數在單例模式下非執行緒安全

[執行緒21] 獲取的count 值為 5

[執行緒53] 獲取的count 值為 5

[執行緒270] 獲取的count 值為 10

[執行緒37] 獲取的count 值為 5

[執行緒341] 獲取的count 值為 10

[執行緒306] 獲取的count 值為 10

[執行緒126] 獲取的count 值為 5

[執行緒30] 獲取的count 值為 5

[執行緒125] 獲取的count 值為 5

[執行緒117] 獲取的count 值為 5

[執行緒46] 獲取的count 值為 5

[執行緒118] 獲取的count 值為 5

[執行緒110] 獲取的count 值為 5

[執行緒109] 獲取的count 值為 5

[執行緒94] 獲取的count 值為 5

更改**將ts 更換成 

new threadsafety()

非單例(非執行緒安全)

import org.junit.test;

public class threadsafety implements runnable catch (interruptedexception e)

count = 10;

system.out.println("[" +thread.currentthread().getname()+"] 獲取的count 值為 "+count );

}@test

public void test()

}}

根據結果發現,靜態變數在非單例模式下也非執行緒安全

[執行緒62] 獲取的count 值為 10

[執行緒118] 獲取的count 值為 10

[執行緒122] 獲取的count 值為 10

[執行緒123] 獲取的count 值為 5

[執行緒121] 獲取的count 值為 10

[執行緒126] 獲取的count 值為 10

[執行緒133] 獲取的count 值為 10

[執行緒119] 獲取的count 值為 5

[執行緒124] 獲取的count 值為 10

[執行緒120] 獲取的count 值為 10

[執行緒95] 獲取的count 值為 10

例項變數單例模式下是非執行緒安全的,非單例模式下是執行緒安全的。

單例模式

import org.junit.test;

public class threadsafety implements runnable catch (interruptedexception e)

count = 10;

system.out.println("[" +thread.currentthread().getname()+"] 獲取的count 值為 "+count );

}@test

public void test()

}}

[執行緒14] 獲取的count 值為 10

[執行緒27] 獲取的count 值為 10

[執行緒6] 獲取的count 值為 10

[執行緒11] 獲取的count 值為 10

[執行緒16] 獲取的count 值為 10

[執行緒26] 獲取的count 值為 10

[執行緒21] 獲取的count 值為 10

[執行緒23] 獲取的count 值為 5

[執行緒5] 獲取的count 值為 5

[執行緒4] 獲取的count 值為 10

[執行緒3] 獲取的count 值為 5

[執行緒35] 獲取的count 值為 10

[執行緒42] 獲取的count 值為 10

[執行緒7] 獲取的count 值為 10

[執行緒0] 獲取的count 值為 10

非單例模式(執行緒安全)

import org.junit.test;

public class threadsafety implements runnable catch (interruptedexception e)

count = 10;

system.out.println("[" +thread.currentthread().getname()+"] 獲取的count 值為 "+count );

}@test

public void test()

}}

區域性變數(執行緒安全)

單例(執行緒安全)

import org.junit.test;

public class threadsafety implements runnable catch (interruptedexception e)

count = 10;

system.out.println("[" +thread.currentthread().getname()+"] 獲取的count 值為 "+count );

}@test

public void test()

}}

非單例(執行緒安全)

import org.junit.test;

public class threadsafety implements runnable catch (interruptedexception e)

count = 10;

system.out.println("[" +thread.currentthread().getname()+"] 獲取的count 值為 "+count );

}@test

public void test()

}}

PHP 全域性變數 區域性變數 靜態變數 常量

全域性變數 在函式外宣告的變數都成為全域性變數,作用域是整個php檔案,但在自定義的函式內部不能使用,想在使用者自定義的函式內部使用全域性變數,必須用global關鍵字宣告變數,或者使用全域性陣列 globals進行訪問 區域性變數 在函式內部宣告的變數,只能在函式內部使用。靜態變數 一般在在函式內...

成員變數 區域性變數 靜態變數

成員變數 成員變數定義在類中,在整個類中都可以被訪問。成員變數隨著物件的建立而建立,隨著物件的消失而消失,存在於物件所在的堆記憶體中。成員變數有預設初始化值。區域性變數 區域性變數只定義在區域性範圍內,如 函式內,語句內等,只在所屬的區域有效。區域性變數存在於棧記憶體中,作用的範圍結束,變數空間會自...

區域性變數,區域性靜態變數,全域性變數,全域性靜態變數分別

c 記憶體到底分幾個區?一 1 棧區 stack 由編譯器自動分配釋放 存放函式的引數值,區域性變數的值等。其操作方式類似於資料結構中的棧。2 堆區 heap 一般由程式設計師分配釋放,若程式設計師不釋放,程式結束時可能由os 注意它與資料結構中的堆是兩回事,分配方式倒是類似於鍊錶,呵呵。3 全域性...