我在java中的volatile和static之间的区别很小, 任何人都可以解释我。
答案 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)
volatile
和static
个关键字的完全含义不同。
static
表示字段(我假设您正在讨论字段,因为方法不能是volatile
)不属于单个对象,而是属于它的类已定义,并且只有一个,而不是每个类的实例不同。
volatile
才有意义。在这种情况下,它会阻止字段的内容被各个线程缓存。如果在一个线程中设置非volatile
字段并在另一个线程中读取,并且在synchronized
块或方法中不会发生这种情况,则第二个线程可以看到该字段的“旧”值任意长的时间。
答案 2 :(得分:1)
就变量而言,static
表示在类的所有对象之间共享变量的一个副本,而不是每个对象一个。
就功能而言,static
意味着该功能不需要一个对象才能让某人调用它:main
就是典型的例子。
另一方面,volatile
意味着可以在正常的控制流外部更改变量,这意味着不应该优化对它的访问。
答案 3 :(得分:0)
主要区别在于线程和对象:基本上静态变量'属于'类与对象实例相关联,而volatile是指实例变量,用于在线程环境中以类似于同步。
更多关于易变的信息:The volatile keyword in Java