JAVA 里static 和volatile的区别

volatile变量在内存中只有一份,static变量在内存中也只有一份;是不是static可以代替volatile,保证不同线程看到的同一个变量的值是相同的?

你要考虑cache的存在,实际上volatile是个类似bug fix的东西

也不算是bug,这只是在JAVA在多线程环境一种需要,volatile改的是内存,而不是引用。

static a =3

执行在b = a后,a无论如何改变 b都不会变化,但volatile会。

一个是改变指向,一个是改变对象。

变量放在主存区上,使用该变量的每个线程,都将从主存区拷贝一份到自己的工作区上进行操作。

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。