了解Java中的对象所有权

时间:2016-01-01 07:37:37

标签: java collections synchronized

我正在阅读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

我们可以稍后修改列表的内容,所以我说同步包装器具有共享所有权。

这有什么不对?

1 个答案:

答案 0 :(得分:3)

  

这有什么问题?

您没有阅读文档。

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

  

返回由指定集合支持的同步(线程安全)集合。为了保证串行访问,必须通过返回的集合完成对后备集合的所有访问。

因此,文档告诉您 NOT 保留对原始列表的引用并进行修改。您必须浏览返回的集合,否则它将无效。

我认为没有任何方法可以通过编程方式强制执行Java的所有权。自动指针不存在(或者至少它们没有实现,所以没有API使用它们)。您只需阅读文档并编写正确的代码即可。