我正在阅读Brian Goetz的Java Concurrency in Practice,并对所谓的对象所有权概念提出了疑问。这就是他所说的:
类通常不拥有传递给其方法或构造函数的对象,除非该方法旨在显式转移传入的对象的所有权(例如synchronized collection包装工厂方法)。
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
我们可以稍后修改列表的内容,所以我会说同步包装器具有共享所有权。
这有什么问题?
这有什么问题?
你没有阅读文档。
返回由指定集合支持的同步(线程安全)集合。为了保证串行访问,必须通过返回的集合完成对后备集合的所有访问。
因此,文档告诉您不要保留对原始列表的引用并进行修改。您必须通过返回的集合或它不起作用。
我认为没有任何方法可以通过编程方式强制执行Java的所有权。自动指针不存在(或者至少它们没有实现,所以没有API使用它们)。您只需阅读文档并编写正确的代码即可。