2016-02-12 86 views
5

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

举个简单的例子:

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))不再是真实的。

除了添加锁之外,还有什么办法可以解决这个问题吗?

+3

这是一个很好的问题,因为要求外部资源(即例子),因此离题越来越近。我已经重写了它以避免这个问题。如果您觉得它太多变化,您可以恢复或编辑。您可能想查看[帮助],并阅读[问]指针。 –

+0

对于这个特定的例子,正如你所说的那样,它并不完全起作用,这取决于你需要提供的保证(例如,如果m稍微落后于l,它可能没问题)。在一般情况下,你不能真正回答这个问题。 – jtahlborn

回答

0

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

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