繁体   English   中英

在同步块中声明了不可访问的变量-Java

[英]Inaccessible variable declared in synchronized block - Java

这段代码将无法编译:

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

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

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

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

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

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

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

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

根据Java语言规范

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM