static和Volatile的區(qū)別?
變量放在主存區(qū)上,使用該變量的每個線程,都將從主存區(qū)拷貝一份到自己的工作區(qū)上進行操作。
Volatile, 聲明這個字段易變(可能被多個線程使用),Java內(nèi)存模型負責(zé)各個線程的工作區(qū)與主存區(qū)的該字段的值保持同步,即一致性。
static, 聲明這個字段是靜態(tài)的(可能被多個實例共享),在主存區(qū)上該類的所有實例的該字段為同一個變量,即唯一性。
volatile, 聲明變量值的一致性;static,聲明變量的唯一性。
此外,volatile同步機制不同于synchronized, 前者是內(nèi)存同步,后者不僅包含內(nèi)存同步(一致性),且保證線程互斥(互斥性)。
static 只是聲明變量在主存上的唯一性,不能保證工作區(qū)與主存區(qū)變量值的一致性;除非變量的值是不可變的,即再加上final的修飾符,否則static聲明的變量,不是線程安全的。
下面摘自Java語言規(guī)范(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。