这段代码不会编译:
synchronized( obj ) {
Object a = new Object()
}
System.out.println( a.toString() );
然而我不知道为什么.. 我的理解是同步块总是最终被执行,所以我希望同步块之后的代码能够知道任何新声明的变量。我哪里错了?
这段代码不会编译:
synchronized( obj ) {
Object a = new Object()
}
System.out.println( a.toString() );
然而我不知道为什么.. 我的理解是同步块总是最终被执行,所以我希望同步块之后的代码能够知道任何新声明的变量。我哪里错了?
这不是同步,而是{}
符号。它们定义了一个范围,无论它们的开头是否有if
, for
, synchronized
,甚至什么都没有。因此,a
一旦块完成,就会超出范围,因为它是在其中声明的。(在声明的末尾还有一个缺少的分号,Object a
但我怀疑你只是忘了复制它。)
变量范围不取决于执行的内容。变量仅在声明它们的块内可见。您可能想要执行以下操作:
Object a;
synchronized( obj ) {
a = new Object()
}
System.out.println( a.toString() );
块内定义的变量并不存在于块外。
来自Java 语言规范:
块中局部变量声明的范围(第 14.2 节)是声明出现的块的其余部分,从其自己的初始化程序(第 14.4 节)开始,并在局部变量声明语句的右侧包括任何进一步的声明符。