【问题标题】:How does a Synchronized Collection Wrapper factory method "own" the object passed into it?Synchronized Collection Wrapper 工厂方法如何“拥有”传递给它的对象?
【发布时间】:2012-07-05 16:15:41
【问题描述】:

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

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

【问题讨论】:

    标签: java multithreading collections concurrency java.util.concurrent


    【解决方案1】:

    一个例外是

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

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

    【讨论】:

    • 确实,如果您在包装后引用支持列表,那是程序员错误。
    • @Peter 但是 synchronizedList 如何“拥有”传入的线程?我在这里对“所有权”一词感到困惑
    • Subhra,这是一个松散的术语,它不是一个语言强制的概念。它适用于讨论编写优质代码的指南。
    • @MarkoTopolnik 感谢您的澄清。我在考虑拥有关系的所有权。
    • 我认为这里使用所有权是按照“对线程安全负责”的方式。
    【解决方案2】:

    这个意义上的拥有一般是指谁负责清理对象所获得的任何资源,即调用CloseDispose或其他此类方法。

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-08-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-07-29
      • 1970-01-01
      相关资源
      最近更新 更多