2

这段代码不会编译:

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

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

然而我不知道为什么.. 我的理解是同步块总是最终被执行,所以我希望同步块之后的代码能够知道任何新声明的变量。我哪里错了?

4

3 回答 3

6

这不是同步,而是{}符号。它们定义了一个范围,无论它们的开头是否有if, for, synchronized,甚至什么都没有。因此,a一旦块完成,就会超出范围,因为它是在其中声明的。(在声明的末尾还有一个缺少的分号,Object a但我怀疑你只是忘了复制它。)

于 2012-02-26T01:32:38.373 回答
1

变量范围不取决于执行的内容。变量仅在声明它们的块内可见。您可能想要执行以下操作:

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

System.out.println( a.toString() );
于 2012-02-26T01:33:11.367 回答
0

块内定义的变量并不存在于块外。

来自Java 语言规范

块中局部变量声明的范围(第 14.2 节)是声明出现的块的其余部分,从其自己的初始化程序(第 14.4 节)开始,并在局部变量声明语句的右侧包括任何进一步的声明符。

于 2012-02-26T01:35:50.577 回答