2016-01-01 49 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使用它们)。您只需阅读文档并编写正确的代码。