Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/371.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/user-interface/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java静态变量-Foo.var=value和var=value之间的差异?_Java_Static_Thread Safety - Fatal编程技术网

Java静态变量-Foo.var=value和var=value之间的差异?

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; 以及: 代码

在Java中,类中有一个静态变量

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;