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