變數放在主存區上,使用該變數的每個執行緒,都將從主存區複製一份到自己的工作區上進行操作。
volatile,宣告這個欄位易變(可能被多個執行緒使用),java記憶體模型負責各個執行緒的工作區與主存區的該欄位的值保持同步,即一致性。
static,宣告這個欄位是靜態的(可能被多個例項共享),在主存區上該類的所有例項的該欄位為同一個變數,即唯一性。
volatile,宣告變數值的一致性;static,宣告變數的唯一性。
此外,volatile同步機制不同於synchronized,前者是記憶體同步,後者不僅包含記憶體同步(一致性),且保證執行緒互斥(互斥性)。
static只是宣告變數在主存上的唯一性,不能保證工作區與主存區變數值的一致性;除非變數的值是不可變的,即再加上final的修飾符,否則static宣告的變數,不是執行緒安全的。
下面摘自java語言規範(javalanguagespecification)的官方解釋:
1)ifafieldisdeclaredstatic,thereexistsexactlyoneincarnationofthefield,nomatterhowmanyinstances(possiblyzero)oftheclassmayeventuallybecreated.
2)afieldmaybedeclaredvolatile,inwhichcasethejavamemorymodelensuresthatallthreadsseeaconsistentvalueforthevariable。
變數放在主存區上,使用該變數的每個執行緒,都將從主存區複製一份到自己的工作區上進行操作。
volatile,宣告這個欄位易變(可能被多個執行緒使用),java記憶體模型負責各個執行緒的工作區與主存區的該欄位的值保持同步,即一致性。
static,宣告這個欄位是靜態的(可能被多個例項共享),在主存區上該類的所有例項的該欄位為同一個變數,即唯一性。
volatile,宣告變數值的一致性;static,宣告變數的唯一性。
此外,volatile同步機制不同於synchronized,前者是記憶體同步,後者不僅包含記憶體同步(一致性),且保證執行緒互斥(互斥性)。
static只是宣告變數在主存上的唯一性,不能保證工作區與主存區變數值的一致性;除非變數的值是不可變的,即再加上final的修飾符,否則static宣告的變數,不是執行緒安全的。
下面摘自java語言規範(javalanguagespecification)的官方解釋:
1)ifafieldisdeclaredstatic,thereexistsexactlyoneincarnationofthefield,nomatterhowmanyinstances(possiblyzero)oftheclassmayeventuallybecreated.
2)afieldmaybedeclaredvolatile,inwhichcasethejavamemorymodelensuresthatallthreadsseeaconsistentvalueforthevariable。