Java 静态变量 - Foo.var = value 和 var = value 之间的区别?
Java static variable - difference between Foo.var = value and var = value?
在 Java 我在 class.
中有一个静态变量
public class Foo {
private static Object var;
...
public void setVar(Object newValue) {
Foo.var = newValue;
//Or:
var = newValue;
}
在我更改变量值的方法(非静态)中,使用之间的区别是什么:
Foo.var = newValue;
并且:
var = newValue;
代码在线程环境中,我想这是它会有所不同的地方。
假设你的代码真的在Foo
class,var
和Foo.var
的意思完全一样。事实上,一些 IDE 实际上会警告您 var
和 Foo.
的前缀是多余的。
如果您的代码在 Foo class 中,那么这两行是等价的。它 可能 将其引用为 Foo.var 稍微好一些,只是为了在 Foo 被 subclassed 并且更改它的代码移动到Foo 的 subclass,很明显它引用了 Foo 中的变量,而不是在 subclass 中引用了另一个同名变量的 subclass。如果您在 Foo 的 subclass 中有引用 Foo 中的变量的代码,那么 subclass 中的同名静态变量将被 subclass 代码看到,而不是Foo 中的那个,如果缺少明确的 class 引用。但除此之外,这两行是相同的。
如果您要更改由多个线程访问的内容,您应该确保它是易变的、原子引用,或者更改的内容并由获取相同锁的线程读取。否则对它的更新可能对其他线程不可见。但是只要不涉及变量阴影,用class名称引用它本身并没有什么区别,它肯定不会影响多线程更新的内存可见性。
在 Java 我在 class.
中有一个静态变量public class Foo {
private static Object var;
...
public void setVar(Object newValue) {
Foo.var = newValue;
//Or:
var = newValue;
}
在我更改变量值的方法(非静态)中,使用之间的区别是什么:
Foo.var = newValue;
并且:
var = newValue;
代码在线程环境中,我想这是它会有所不同的地方。
假设你的代码真的在Foo
class,var
和Foo.var
的意思完全一样。事实上,一些 IDE 实际上会警告您 var
和 Foo.
的前缀是多余的。
如果您的代码在 Foo class 中,那么这两行是等价的。它 可能 将其引用为 Foo.var 稍微好一些,只是为了在 Foo 被 subclassed 并且更改它的代码移动到Foo 的 subclass,很明显它引用了 Foo 中的变量,而不是在 subclass 中引用了另一个同名变量的 subclass。如果您在 Foo 的 subclass 中有引用 Foo 中的变量的代码,那么 subclass 中的同名静态变量将被 subclass 代码看到,而不是Foo 中的那个,如果缺少明确的 class 引用。但除此之外,这两行是相同的。
如果您要更改由多个线程访问的内容,您应该确保它是易变的、原子引用,或者更改的内容并由获取相同锁的线程读取。否则对它的更新可能对其他线程不可见。但是只要不涉及变量阴影,用class名称引用它本身并没有什么区别,它肯定不会影响多线程更新的内存可见性。