2010-01-19 133 views
6

與線程安全和不可變對象有什麼關係?在多個線程之間共享單個資源會更容易嗎?如果不可變對象是無狀態的,它們是否可以像容器一樣集中在一個容器中?什麼是不可變對象?

謝謝

回答

5

線程安全對象是允許多線程併發訪問的對象。它們的實現保證(例如通過鎖定/同步方法/ ...)它們不會進入無效狀態。另外,不應該丟失數據。

不可變對象創建後可能不會更改。所以:是的,他們是某種無國籍人。

由於不可變對象無法更改,因此不需要鎖定 - 對對象的讀取訪問始終是線程安全的(當不修改變量時)。因此,真正的不可變對象始終是線程安全的。

+1

通常無狀態的對象沒有狀態。不可變對象不能轉換到與它們創建的狀態不同的狀態,因此它們只有一個狀態。 – 2010-01-19 18:15:03

4

不可變對象:不改變其內部狀態的對象。

與線程安全的關係:如果一個對象不能被改變,跨線程使用它是安全的,即不需要鎖定或類似的來確保跨線程的一致性

10

不可變對象是無法更改的對象。如果一個對象不能被改變,那麼不用擔心競爭線程會改變正在執行的線程的「背後」的對象狀態,因此不需要通過同步或其他技術來保護不可變對象。

+1

另外如果對象是無狀態的,則毫無意義地談論不變性,因爲沒有狀態可以變異。所以可以安全地將物體放入容器中。 – Mauricio 2010-01-19 17:53:06

+0

需要考慮的一件事是,如果您嘗試通過重新分配指向該對象的變量來更改不可變對象(例如,字符串),則其他線程將不會看到該更改。因此,對不可變對象的「更改」不能在線程間共享。 – Aaron 2010-01-19 17:59:57

+0

如果您嘗試通過重新分配引用該對象的變量來「更改」任何對象,那麼您不知道自己在做什麼。 – 2010-01-19 18:15:38

相關問題