Multithreading 无锁哈希表实际上是如何工作的
我通过了 及 我不明白这些哈希表怎么会是锁费。我的意思是,如果我们在哈希表getItem和setItem上有两个方法。这是我的职责Multithreading 无锁哈希表实际上是如何工作的,multithreading,hashmap,locking,concurrenthashmap,Multithreading,Hashmap,Locking,Concurrenthashmap,我通过了 及 我不明白这些哈希表怎么会是锁费。我的意思是,如果我们在哈希表getItem和setItem上有两个方法。这是我的职责 function increment2(key): val = hashtable.getItem(key) + 2 hashtable.setItem(val) 现在这个函数在两个线程中运行,如果我不在这个函数中使用锁,hashtable.getItem(key)的值可以增加2或4。 我很困惑,有人能帮我理解一下吗当谈到并发容器时,我们通常指的是
function increment2(key):
val = hashtable.getItem(key) + 2
hashtable.setItem(val)
现在这个函数在两个线程中运行,如果我不在这个函数中使用锁,hashtable.getItem(key)的值可以增加2或4。
我很困惑,有人能帮我理解一下吗当谈到并发容器时,我们通常指的是为这个容器定义的单个操作是原子的。在您的例子中,hashtable.getItem(key)
和hashtable.setItem(key,val)
是原子操作。例如,如果.getItem()
与.setItem()
同时执行,则它将返回新值或旧值,但不会混合返回
但是并发容器不能保证,它的两个或多个操作的序列是原子的。若用户需要操作序列的原子属性,那个么他不应该期望从容器的实现中得到这个属性,而是手工实现这个属性。在您的例子中,如果您需要increment2
函数成为原子函数,那么您需要自己实现这个属性
基于锁的并发容器通常可以很容易地修改,以使某些操作序列具有原子性
从另一方面来说,无锁并发容器很难被扩展为具有原子操作序列。从这个意义上说,无锁算法非常脆弱