【问题标题】:What is the correct way of creating a defensive copy in a constructor在构造函数中创建防御性副本的正确方法是什么
【发布时间】:2016-05-22 15:25:16
【问题描述】:

我有以下私人收藏:

final private ConcurrentHashMap<Book,BookLog> booklogMap;

我目前在构造函数中这样复制:

this.booklogMap = new ConcurrentHashMap<Book, BookLog>(booklogMap);

这是在构造函数中创建防御性副本的正确方法吗?如果不是,您如何正确地制作线程安全集合的防御性副本?

【问题讨论】:

  • 使用不可更改的包装器怎么样? stackoverflow.com/a/4262459/13422
  • @ZanLynx - 我试过了,但它一直给我投射错误,你能告诉我怎么做吗?
  • 我从未在 Concurrent 上尝试过任何东西,可能需要进行实验。
  • 如果要在调用 ctor 时捕获地图的状态,则需要进行复制。使用不可更改的包装器只会阻止您的类修改列表。如果其他代码更改了列表,那么您的班级将看到这些更改,您的班级将不得不担心对列表的并发更改。
  • @pcarter - 我将如何处理并发哈希图?

标签: java multithreading


【解决方案1】:

this.booklogMap = new ConcurrentHashMap(booklogMap);

这是一个复制构造函数。几乎所有标准的 Collection 和 Map 实现都有一个,它通常是克隆简单结构的最简单方法。只要 Book 和 BookLog 是不可变的,这就可以正常工作。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-01-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-03-30
    相关资源
    最近更新 更多