這段代碼不會編譯:在synchronized塊中聲明無法訪問的變量 - Java的
synchronized(obj) {
Object a = new Object()
}
System.out.println(a.toString());
但我不知道爲什麼。我的理解是,一個synchronized塊總是最後執行的,所以我會希望在synchronized塊之後的代碼能夠知道任何新的聲明變量。我錯在哪裏?
這段代碼不會編譯:在synchronized塊中聲明無法訪問的變量 - Java的
synchronized(obj) {
Object a = new Object()
}
System.out.println(a.toString());
但我不知道爲什麼。我的理解是,一個synchronized塊總是最後執行的,所以我會希望在synchronized塊之後的代碼能夠知道任何新的聲明變量。我錯在哪裏?
這不是同步,而是{}
符號。他們定義了一個範圍,不管是否存在if
,for
,,或者甚至在它們的開頭都沒有。因此,a
一旦完成,就會超出範圍,因爲它已在其中聲明。 (在Object a
聲明結尾處還有一個缺失的分號,但我懷疑你只是忘了複製它。)
變量作用域不取決於執行的內容。變量是隻有他們在聲明的塊內可見你可能想要做這樣的事情:一個塊不住外塊內部定義
Object a;
synchronized(obj) {
a = new Object()
}
System.out.println(a.toString());
變量。
局部變量聲明的塊中的(§14.2)的範圍是在其中出現的聲明,開始與它自己的初始化該塊的其餘部分(§14.4)和包括任何在局部變量聲明語句中右側的進一步聲明者。
謝謝!盲目地盯着同步使我完全忽略了這一事實。 – Antiz 2012-02-26 02:11:16