Java静态变量-Foo.var=value和var=value之间的差异?
在Java中,类中有一个静态变量Java静态变量-Foo.var=value和var=value之间的差异?,java,static,thread-safety,Java,Static,Thread Safety,在Java中,类中有一个静态变量 public class Foo { private static Object var; ... public void setVar(Object newValue) { Foo.var = newValue; //Or: var = newValue; } 在我更改变量值的方法(非静态)中,使用以下方法的区别是什么: Foo.var = newValue; 以及: 代码
public class Foo {
private static Object var;
...
public void setVar(Object newValue) {
Foo.var = newValue;
//Or:
var = newValue;
}
在我更改变量值的方法(非静态)中,使用以下方法的区别是什么:
Foo.var = newValue;
以及:
代码是在线程环境中的,我想这就是它将产生任何影响的地方。假设您的代码确实在
Foo
类中,var
和Foo.var
的意思完全相同。事实上,一些IDE实际上会警告您在var
前面加上Foo。
是多余的。如果您的代码在Foo类中,那么这两行是等价的。将其引用为Foo.var可能会稍微好一点,这样在Foo被子类化并且代码更改时,它会被移动到Foo的子类中,很明显它引用的是Foo中的一个变量,而不是使用另一个同名变量隐藏var的子类中的一个变量。如果在Foo的子类中有引用Foo中变量的代码,那么如果缺少显式类引用,子类代码将看到子类中具有相同名称的静态变量,而不是Foo中的静态变量。但除此之外,这两条线是相同的
如果您正在更改由多个线程访问的内容,您应该确保它是易失性的、原子引用的,或者是由获取相同锁的线程更改和读取的内容。否则,其他线程可能看不到对它的更新。但只要不涉及变量阴影,用类名引用它与否本身不会有什么区别,它肯定不会影响多个线程更新的内存可见性。不同符号唯一的区别是当
var
是final
时,您尝试在初始化之前将其用作值。(当标识符var
被隐藏时也有区别。)
var = newValue;