2012-02-26 100 views
2

这段代码不会编译:在synchronized块中声明无法访问的变量 - Java的

synchronized(obj) { 
     Object a = new Object() 
    } 

    System.out.println(a.toString()); 

但我不知道为什么。我的理解是,一个synchronized块总是最后执行的,所以我会希望在synchronized块之后的代码能够知道任何新的声明变量。我错在哪里?

回答

5

这不是同步,而是{}符号。他们定义了一个范围,不管是否存在iffor,​​,或者甚至在它们的开头都没有。因此,a一旦完成,就会超出范围,因为它已在其中声明。 (在Object a声明结尾处还有一个缺失的分号,但我怀疑你只是忘了复制它。)

+1

谢谢!盲目地盯着同步使我完全忽略了这一事实。 – Antiz 2012-02-26 02:11:16

1

变量作用域不取决于执行的内容。变量是只有他们在声明的块内可见你可能想要做这样的事情:一个块不住外块内部定义

Object a; 
synchronized(obj) { 
    a = new Object() 
} 

System.out.println(a.toString()); 
0

变量。

Java Language Specification

局部变量声明的块中的(§14.2)的范围是在其中出现的声明,开始与它自己的初始化该块的其余部分(§14.4)和包括任何在局部变量声明语句中右侧的进一步声明者。