2012-02-26 98 views
2

這段代碼不會編譯:在synchronized塊中聲明無法訪問的變量 - Java的

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

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

但我不知道爲什麼。我的理解是,一個synchronized塊總是最後執行的,所以我會希望在synchronized塊之後的代碼能夠知道任何新的聲明變量。我錯在哪裏?

回答

5

這不是同步,而是{}符號。他們定義了一個範圍,不管是否存在iffor,​​,或者甚至在它們的開頭都沒有。因此,a一旦完成,就會超出範圍,因爲它已在其中聲明。 (在Object a聲明結尾處還有一個缺失的分號,但我懷疑你只是忘了複製它。)

+1

謝謝!盲目地盯着同步使我完全忽略了這一事實。 – Antiz 2012-02-26 02:11:16

1

變量作用域不取決於執行的內容。變量是隻有他們在聲明的塊內可見你可能想要做這樣的事情:一個塊不住外塊內部定義

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

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

變量。

Java Language Specification

局部變量聲明的塊中的(§14.2)的範圍是在其中出現的聲明,開始與它自己的初始化該塊的其餘部分(§14.4)和包括任何在局部變量聲明語句中右側的進一步聲明者。