В синхронизированном блоке объявлена ​​недоступная переменная - Java - PullRequest
2 голосов
/ 26 февраля 2012

Этот фрагмент кода не будет компилироваться:

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

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

Но я не знаю, почему .. Насколько я понимаю, синхронизированный блок всегда выполнялся, поэтому я ожидал, что код будет следовать за синхронизированным блоком.знать о любых новых объявленных переменных.Где я не прав?

Ответы [ 3 ]

5 голосов
/ 26 февраля 2012

Это не синхронизация, это {} символы.Они определяют область действия, независимо от того, есть ли if, for, synchronized или даже ничего в начале.Таким образом, a выходит из области видимости после завершения блока, потому что он был объявлен внутри него.(Также в конце объявления Object a есть пропущенная точка с запятой, но я подозреваю, что вы просто забыли скопировать это.)

1 голос
/ 26 февраля 2012

Область действия переменной не определяется тем, что выполняется. Переменные видны только внутри блока, в котором они объявлены. Возможно, вы захотите сделать что-то вроде этого:

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

System.out.println( a.toString() );
0 голосов
/ 26 февраля 2012

Переменные, определенные внутри блока, не находятся вне блока.

Из Спецификации языка Java :

Область объявления локальной переменной в блоке(§14.2) является остальной частью блока, в котором появляется объявление, начиная с его собственного инициализатора (§14.4) и включая любые дальнейшие деклараторы справа в операторе объявления локальной переменной.

...