回覆列表
-
1 # 使用者1118065681947
-
2 # 使用者8316781897443
static有兩種用法:面向過程程式設計中的static和麵向物件程式設計中的static。前者應用於普通變數和函式,不涉及類;後者主要說明static在類中的作用。
就象大家更熟悉的const一樣,volatile是一個型別修飾符(type specifier)。它是被設計用來修飾被不同執行緒訪問和修改的變數。如果沒有volatile,基本上會導致這樣的結果:要麼無法編寫多執行緒程式,要麼編譯器失去大量最佳化的機會。下面我們來一個個說明。
考慮下面的程式碼:
程式碼:
class Gadget
{
public:
void Wait()
{
while (!flag_)
{
Sleep(1000); // sleeps for 1000 milliseconds
}
}
void Wakeup()
{
flag_ = true;
}
...
private:
bool flag_;
};
變數放在主存區上,使用該變數的每個執行緒,都將從主存區複製一份到自己的工作區上進行操作。
volatile, 宣告這個欄位易變(可能被多個執行緒使用),Java記憶體模型負責各個執行緒的工作區與主存區的該欄位的值保持同步,即一致性。
static, 宣告這個欄位是靜態的(可能被多個例項共享),在主存區上該類的所有例項的該欄位為同一個變數,即唯一性。
volatile, 宣告變數值的一致性;static,宣告變數的唯一性。
此外,volatile同步機制不同於synchronized, 前者是記憶體同步,後者不僅包含記憶體同步(一致性),且保證執行緒互斥(互斥性)。
static 只是宣告變數在主存上的唯一性,不能保證工作區與主存區變數值的一致性;除非變數的值是不可變的,即再加上final的修飾符,否則static宣告的變數,不是執行緒安全的。
下面摘自Java語言規範(Java Language Specification)的官方解釋:
1) If a field is declared static, there exists exactly one incarnation of the field, no matter how many instances (possibly zero) of the class may eventually be created.
2) A field may be declared volatile, in which case the Java Memory Model ensures that all threads see a consistent value for the variable。