4

在 Java Concurrency in Practice 一书中,Brian Goetz 说传递给类的构造函数和方法的对象归类本身所有。是不是因为他们是外面来的,班上没管他们?

他接着说,如果一个方法被显式设计为传递传入对象的所有权(例如同步集合包装器工厂方法),则存在一个例外。有人可以举一个相同的例子并向我解释如何将其视为例外吗?

4

2 回答 2

4

一个例外是

List<String> syncList = Collections.synchronizedList(new ArrayList<>());

您可以看到 synchronizedList 的设计方式只要包装器对象拥有对底层数组列表的唯一可访问引用,它就承担了线程安全责任的所有权。

于 2012-07-05T09:19:46.143 回答
0

从这个意义上说,拥有通常与谁负责清理对象获取的任何资源,即调用CloseDispose其他此类方法。

如果一个方法返回一个对象以供使用(例如工厂方法),那么在返回之前关闭这个对象是没有意义的,因为它会变得不可用 - 因此所有权被转移,它成为调用代码的责任清理。

在某些情况下,将所有权转移给被调用代码是有意义的。当新对象的使用与它的底层机制无关时,通常会出现这种情况。例如,如果我有一个能够读取字符串的类的接口,我不希望根据从哪里读取字符串(文件流、网络流、内存等)以不同的方式使用这些实现。因此,如果实现需要 Stream 的实例,则将 Stream 的所有权传递给字符串读取器实现而不是创建 Stream 的类是明智的。

于 2012-07-05T09:22:43.197 回答