锁定哈希表如何实际工作

时间:2015-10-26 18:37:33

标签: multithreading hashmap locking concurrenthashmap

我经历了http://preshing.com/20130529/a-lock-free-linear-search/https://code.google.com/p/nbds/

我无法理解这些哈希表是如何锁定费用的。我的意思是如果我们在哈希表getItem和setItem上有两个方法。这是我的功能

function increment2(key):
    val = hashtable.getItem(key) + 2
    hashtable.setItem(val)

现在这个函数在2个线程中运行,现在如果我在这个函数中没有使用锁,则hashtable.getItem(key)的值可以增加2或4。 我很困惑有人可以帮助我理解

1 个答案:

答案 0 :(得分:0)

当谈到并发容器时,我们通常意味着为此容器定义的单一操作 是原子的。在您的情况下,hashtable.getItem(key)hashtable.setItem(key, val)原子操作。例如。如果.getItem().setItem()同时执行,则会返回新值或旧值,但不会混合使用。

但并发容器并不保证,的两个或更多序列 是原子。如果用户需要操作序列的原子属性,他不应该期望容器的实现中的这个属性,而是手工实现这个属性。在您的情况下,如果您需要increment2函数为 atomic ,则需要自己实现此属性。

基于锁定的并发容器通常可以轻松修改,以使某些操作序列成为原子。

另一方面,无锁定的并发容器几乎不能扩展,以使操作序列成为原子。无锁算法非常脆弱。