这段代码不会编译:在synchronized块中声明无法访问的变量 - Java的
synchronized(obj) {
Object a = new Object()
}
System.out.println(a.toString());
但我不知道为什么。我的理解是,一个synchronized块总是最后执行的,所以我会希望在synchronized块之后的代码能够知道任何新的声明变量。我错在哪里?
这段代码不会编译:在synchronized块中声明无法访问的变量 - Java的
synchronized(obj) {
Object a = new Object()
}
System.out.println(a.toString());
但我不知道为什么。我的理解是,一个synchronized块总是最后执行的,所以我会希望在synchronized块之后的代码能够知道任何新的声明变量。我错在哪里?
这不是同步,而是{}
符号。他们定义了一个范围,不管是否存在if
,for
,,或者甚至在它们的开头都没有。因此,a
一旦完成,就会超出范围,因为它已在其中声明。 (在Object a
声明结尾处还有一个缺失的分号,但我怀疑你只是忘了复制它。)
变量作用域不取决于执行的内容。变量是只有他们在声明的块内可见你可能想要做这样的事情:一个块不住外块内部定义
Object a;
synchronized(obj) {
a = new Object()
}
System.out.println(a.toString());
变量。
局部变量声明的块中的(§14.2)的范围是在其中出现的声明,开始与它自己的初始化该块的其余部分(§14.4)和包括任何在局部变量声明语句中右侧的进一步声明者。
谢谢!盲目地盯着同步使我完全忽略了这一事实。 – Antiz 2012-02-26 02:11:16