此代码编译(使用Java 8),发出警告The assignment to variable value has no effect
:
package test;
public class Test {
private static int value;
static {
value = Test.value;
}
public static void main(String[] args) {
System.out.println(value);
}
}
该计划按预期输出0
。但是为什么编译器允许这个,用例是什么?
答案 0 :(得分:2)
因为Java中的变量具有在任何其他初始化之前初始化的默认值,除非在声明变量时直接进行初始化。确实value
是0
。
警告似乎是合理的,为自己分配变量没有明显的效果,但我不认为它应该被视为编译类型错误,因为它在语法和语义上都是正确的。
答案 1 :(得分:1)
如果将变量赋给自身,则编译器会发出警告,如下所示:
int x = 2;
x = x;
这个警告通常是编程问题的标志,所以拥有它是好事,但在变量是volatile的情况下,这将是 ONLIEST 有用< strong>使用案例我可以想一想,警告是不正确的。
int y = 0;
volatile int x = 2;
y = 3;
x = x;
java内存模型强制按顺序读取x和y的每个线程都保证看到y的值为3。这是因为在一个线程中分配x并在另一个线程中读取x会建立事先排序。
赋值对变量的值没有影响,但它对并发性有很大的影响。
请注意,在上面的示例中,可以使用
来抑制警告 x = x + 0;
然而,没有这样的黑客参考。在尝试同步int[]
的内容时,会遇到一个用例。一个线程读取成员:
myarray[3]
和另一个线程写成员:
myarray[3] = 2;
因为数组成员他们自己不能是volatile,所以你必须使myarray
volatile并将以下内容添加到写入线程中:
myarrray = myarray;