在synchronized块中声明的无法访问的变量 - Java

时间:2012-02-26 01:29:59

标签: java synchronized synchronized-block

这段代码无法编译:

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

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

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

3 个答案:

答案 0 :(得分:5)

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

答案 1 :(得分:1)

变量范围不是由执行的内容决定的。变量只在它们声明的块内可见。你可能想要做这样的事情:

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

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

答案 2 :(得分:0)

块内定义的变量不在块外部。

来自Java Language Specification

块(第14.2节)中局部变量声明的范围是声明出现的块的其余部分,从其自己的初始化器(第14.4节)开始,并包括局部变量右侧的任何其他声明器声明声明。