2016-01-01 84 views
1

我正在閱讀B. Goetz Java併發在pratcice中並且有關於所謂的對象所有權概念的問題。以下是他說:瞭解Java中的對象所有權

類通常並不擁有傳遞給它的方法或 構造的對象,除非該法旨在明確轉讓(傳遞的對象 所有權,如同步採集 包裝廠方法)。

Collections.synchronizedCollection(Collection) source是:

public static <T> Collection<T> More ...synchronizedCollection(Collection<T> c) { 
    return new SynchronizedCollection<T>(c); 
} 

其中SynchornizedCollection的構造是:

SynchronizedCollection(Collection<E> c) { 
    if (c==null) 
     throw new NullPointerException(); 
    this.c = c; 
    mutex = this; 
} 

所以,如果我們把這種方法如下:

List<Date> lst; 
//initialize the list 
Collection<Date> synchedLst = Collections.syncrhonizedCollection(lst); 
//modify lst's content 

我們可以修改列表的內容稍後,所以我會說同步包裝具有共享所有權。

這是什麼問題?

回答

2

這是怎麼回事?

您沒有閱讀文檔。

https://docs.oracle.com/javase/8/docs/api/java/util/Collections.html#synchronizedCollection-java.util.Collection-

返回由指定collection支持的同步(線程安全的)集合。爲了保證串行訪問,通過返回的集合完成對後備集合的所有訪問是非常重要的。

所以文檔告訴你不是保留對原始列表的引用並對其進行修改。你必須通過返回的集合或它不起作用。

我不認爲有任何方式通過編程實現Java的所有權。自動指針不能存在(或者至少它們沒有實現,所以沒有API使用它們)。您只需閱讀文檔並編寫正確的代碼。