【问题标题】:Excluding concurrent activity from a concurrent Java collection从并发 Java 集合中排除并发活动
【发布时间】:2014-11-18 09:47:12
【问题描述】:

Joshua Bloch 的 Effective Java,第二版,第 69 条指出

[...] 提供 高并发,这些实现在内部管理它们自己的同步(条目 67)。因此,不可能排除并发活动 并发集合;锁定它不会有任何效果,但会减慢程序。

最后这句话正确吗?如果两个线程锁定该集合并在该锁定内执行多个操作,这些操作可能仍是交错的?

为了使语句正确,我希望这些集合在内部运行您无法同步的线程,或者它们以某种方式“覆盖”标准同步行为,使得像 synchronized(map){ ... } 这样的语句的行为不同于“正常” ' 目的。从答案/cmets 到相关问题,我认为如果这些都不是真的:

为避免可能的误解:

  • 我知道并发集合的设计正是为了避免这种全局锁定,我的问题是原则上是否可行
  • 我发现 Effective Java 是一本非常棒的书,我只是想弄清楚某个特定项目。

【问题讨论】:

    标签: java concurrency effective-java


    【解决方案1】:

    Sources 建议 ConcurrentHashMap 使用内部锁定机制 (static final class [More ...] Segment<K,V> extends ReentrantLock),因此不使用任何 synchronized 方法作为其锁定机制。

    因此,将Map 用作锁并在其上使用synchronize 应该很简单——就像您可以使用new Object() 或您自己的ReentrantLock 一样。但是,它不会影响 Map 的内部运作,这就是 - 我认为 - 他想说的话。

    【讨论】:

    • 感谢您的回答。可能作者确实基本上意味着不可能从并发集合中排除并发活动鉴于您不控制该集合的所有访问点
    【解决方案2】:

    这可能会澄清它(来自另一个第 67 条的提示):

    客户端不可能在这种方法上执行外部同步,因为不能保证不相关的客户端也会这样做。

    您的代码是这些内部同步并发实现的客户端。即使您使用外部锁(以减慢速度),其他客户端也可能不会并且仍将同时执行内部实现。

    【讨论】:

      猜你喜欢
      • 2012-03-02
      • 1970-01-01
      • 1970-01-01
      • 2021-07-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-11
      • 2014-04-28
      相关资源
      最近更新 更多