2

在書中Java Concurrency in Practice中,Brian Goetz說傳遞給類的構造函數和方法的對象是而不是由類本身擁有。是因爲他們是從外面來的,班上無法控制他們?Synchronized Collection Wrapper工廠方法如何「擁有」傳遞給它的對象?

他繼續說,如果某個方法被明確設計爲轉移傳入的對象(例如Synchronized collection wrapper factory方法)的所有權,那麼存在例外情況。有人能給出一個相同的例子,並向我解釋這可以被認爲是一個例外嗎?

回答

3

一個例外是

List<String> syncList = Collections.synchronizedList(new ArrayList<>()); 

你可以看到,synchronizedList的方式設計的,它承擔的線程安全責任的歸屬,只要包裝對象持有的唯一可達參考下面的數組列表。

+1

事實上,如果在包裝完成後引用支持列表,那是程序員錯誤。 – 2012-07-05 09:22:38

+0

@Peter但是synchronizedList如何「擁有」傳入的線程?我在這裏與「所有權」這個術語混淆 – Inquisitive 2012-07-05 09:22:47

+4

Subhra,這是一個鬆散的術語,它不是一個語言強制的概念。它在討論編寫高質量代碼的指導方針時起作用。 – 2012-07-05 09:26:36

0

擁有這種意義一般涉及誰有責任清理對象獲得的任何資源,即調用Close,Dispose或其他此類方法。

如果一個方法返回一個對象以供使用(比如工廠方法),那麼這個對象在被返回之前被關閉是沒有意義的,因爲它會變得不可用 - 因此所有權被轉移並且它變成了責任的調用代碼清理。

在某些情況下,將所有權轉讓給被叫代碼是有意義的。當新對象的使用不知道它的基本機制時,往往是這種情況。例如,如果我有一個能夠讀取字符串的類的接口,那麼根據從中讀取字符串的位置(文件流,網絡流,內存等),我不希望以不同的方式使用這些實現。因此,如果實現需要Stream實例,那麼Stream的所有權傳遞給字符串讀取器實現而不是創建Stream的類將是明智的。