了解Java中的对象所有权

问题描述 投票:2回答:1

我正在阅读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 collections synchronized
1个回答
3
投票

这有什么问题?

你没有阅读文档。

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

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

因此,文档告诉您不要保留对原始列表的引用并进行修改。您必须通过返回的集合或它不起作用。

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

© www.soinside.com 2019 - 2024. All rights reserved.