2010-03-17 55 views
13

Java內存模型(自1.5)將final字段視爲與非final字段不同。特別是,如果this引用在構造過程中不會轉義,則在構造函數中寫入final字段可保證在其他線程上可見,即使該對象可通過數據爭用提供給其他線程。 (寫於非final字段都不能保證是可見的,所以如果你不當發佈它們,另一個線程可以看到他們在部分構造狀態。)Scala和Java內存模型

是否有關於如何/如果Scala編譯器創建的任何文件final(而不是非final)支持類的字段?我瀏覽了語言規範並搜索了網頁,但找不到任何明確的答案。 (在比較@scala.volatile註釋記錄標記字段爲volatile

回答

4

我透過歷史挖出來找出變更時間。

斯卡拉進入JVM的投影未涵蓋的語言規範。

+7

但是從併發的角度來看,語言結構的行爲應該成爲我會爭辯的規範的一部分! –

3

它創建了一個final場當你聲明的東西爲val。任何可以修改引用的內容,例如var,都可以(明顯)不在final之下。

這意味着case classes包含最終場也(爲參數的情況下,類構造函數是隱式val S)

+1

我不認爲這是過去的情況(例如,請參閱http://old.nabble.com/Val-and-Final-td13355515.html)。我的問題的部分原因 - 如果沒有任何文檔可以改變,我怎麼知道它不會再改變? –

+1

你是對的,應該記錄下來。這不僅僅是性能問題,而是由於內存模型造成的語言本身的一部分。我並不知道vals曾經是非最終的 –

2

我在Scala bug系統中爲此提交了一個文檔錯誤。