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;

代码在线程环境中,我想这是它会有所不同的地方。

假设你的代码真的在Fooclass,varFoo.var的意思完全一样。事实上,一些 IDE 实际上会警告您 varFoo. 的前缀是多余的。

如果您的代码在 Foo class 中,那么这两行是等价的。它 可能 将其引用为 Foo.var 稍微好一些,只是为了在 Foo 被 subclassed 并且更改它的代码移动到Foo 的 subclass,很明显它引用了 Foo 中的变量,而不是在 subclass 中引用了另一个同名变量的 subclass。如果您在 Foo 的 subclass 中有引用 Foo 中的变量的代码,那么 subclass 中的同名静态变量将被 subclass 代码看到,而不是Foo 中的那个,如果缺少明确的 class 引用。但除此之外,这两行是相同的。

如果您要更改由多个线程访问的内容,您应该确保它是易变的、原子引用,或者更改的内容并由获取相同锁的线程读取。否则对它的更新可能对其他线程不可见。但是只要不涉及变量阴影,用class名称引用它本身并没有什么区别,它肯定不会影响多线程更新的内存可见性。