2011-11-01 19 views

回答

5

通常,沒有。使用不可變數據的一個主要優點是可以避免鎖定,因爲您可以隱式保證數據是「最新」的,包括您在內的任何人都無法修改它。

+0

通常?這聽起來像是一個漏洞。你能詳細說明一下嗎? –

+0

@trinithis我特別說明了這一點,因爲您沒有指定語言,平臺或框架等。我不知道任何語言在線程情況下會對不可變數據產生問題,但我不想要完全關上門,因爲我個人並沒有使用過每一個門。但是,對於主要的語言,它應該是安全的... –

1

不,如果它確實是完全不可變的。

3

在某些情況下,如果某個只讀接口提供了AcquireReadLock方法(如果該接口的某些實現可能需要鎖定),則可能需要該方法。實現接口的不可變對象不一定要做任何事情來響應AcquireReadLock請求,但它必須爲該方法提供至少一個存根實現;在嘗試執行一系列讀取操作之前,該方法的用戶可能需要調用AcquireReadLock,如果某些其他線程在它們之間改變了對象,則可能會產生不希望的結果(請注意,即使該對象不能使用只讀接口,只讀接口的存在並不意味着該對象不會通過其他方式進行變異)。此外,即使一個否則不可變的對象不需要鎖定,它仍然可能想要有一個「模擬」鎖定的選項,以確認對象的使用者正確獲取和釋放鎖。