【问题标题】:Thread-safe access to multiple concurrent data structures对多个并发数据结构的线程安全访问
【发布时间】:2016-02-12 19:29:28
【问题描述】:

我们如何在保持线程安全的同时访问多个并发数据结构?不同步是否可以做到这一点?

举个简单的例子:

ConcurrentHashmap m;
CopyOnWriteArrayList l;

public bool enterListNode(int elem) {
    Node node = l.get(elem);
    String key = node.key(); //key is immutable
    int val = node.val(); //val is immutable
    val = m.putIfAbsent(key, val);
    return val;
}

这个例子不是线性化的,因为当我们做putIfAbsent(key, val) 时,(node==l.get(elem)) 可能不再是真的。

除了加锁还有什么办法解决吗?

【问题讨论】:

  • 这是一个很好的问题,由于要求外部资源(即示例)而危险地接近离题。我已经改写它以避免这个问题。如果您觉得变化太大,您可以还原或编辑。您可能想查看help center 并阅读How to Ask 以获得指针。
  • 对于这个特定示例,正如您所说,它并不完全有效,具体取决于您需要提供的保证(即,如果 m 稍微落后于 l 可能没问题)。在一般情况下,您无法真正回答这个问题。

标签: java concurrency concurrenthashmap


【解决方案1】:

例如,如果您放入列表l 中的对象从未被替换,而仅修改了对象Node 中包含的值,那么您将不需要锁定。但是实现起来会很棘手,因为您需要在程序开始时用空对象填充数组。

然后,从列表中检索到的所有对象都将与列表中的相同,您将是安全的。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-09-07
    • 2017-12-20
    • 2023-04-08
    • 1970-01-01
    • 2018-06-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多