任何人都可以告诉我java中volatile和static之间的区别

时间:2011-02-03 12:25:33

标签: java

我在java中的volatile和static之间的区别很小, 任何人都可以解释我。

4 个答案:

答案 0 :(得分:5)

变量的

static表示它是类作用域,而不是实例作用域。即它只有一个,由类的每个实例共享。当您从类外部引用static变量时,您需要使用类名来限定它,而不是使用类的实例:

class Example {
  static int staticVar = 0;
  int instanceVar = 0;
}

Example ex = new Example();
ex.instanceVar = 1;
ex.staticVar = 2; // you may get an IDE/compiler warning for this
Example.staticVar = 3; // this is the best way to access your static variable

Th static限定符也可以与方法(其中含义相同)和内部类(其中它表示内部类实例)一起使用不绑定到外部类的任何实例。)

volatile与并发编程有关;它确保变量可以在多个线程之间共享(有一些限制)。

所以两者没有太多共同之处,只是两者都可以限定变量。

答案 1 :(得分:3)

volatilestatic个关键字的完全含义不同。

static表示字段(我假设您正在讨论字段,因为方法不能是volatile)不属于单个对象,而是属于它的类已定义,并且只有一个,而不是每个类的实例不同。

仅当您有多个线程访问字段时,

volatile才有意义。在这种情况下,它会阻止字段的内容被各个线程缓存。如果在一个线程中设置非volatile字段并在另一个线程中读取,并且在synchronized块或方法中不会发生这种情况,则第二个线程可以看到该字段的“旧”值任意长的时间。

答案 2 :(得分:1)

就变量而言,static表示在类的所有对象之间共享变量的一个副本,而不是每个对象一个。

就功能而言,static意味着该功能不需要一个对象才能让某人调用它:main就是典型的例子。

另一方面,volatile意味着可以在正常的控制流外部更改变量,这意味着不应该优化对它的访问。

答案 3 :(得分:0)

主要区别在于线程和对象:基本上静态变量'属于'类与对象实例相关联,而volatile是指实例变量,用于在线程环境中以类似于同步。

更多关于易变的信息:The volatile keyword in Java