2012-02-26 4 views
2

Этот фрагмент кода не будет компилироваться:Недоступный переменная, объявленная в синхронизированный блок - Java

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

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

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

ответ

5

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

+1

Спасибо! Слепое слепое наблюдение за синхронизацией заставило меня полностью игнорировать этот факт. – Antiz

1

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

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

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

Переменные, определенные внутри блока не живут за пределами этого блока.

От Java Language Specification:

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

Смежные вопросы