ruby - 遍历 ruby​​ Hash 时并发修改

标签 ruby collections hash concurrency

假设你有这个:

def wipeProduct(hash, nameToDelete) 
  hash.each do |i| 
    key = i[0]
    productName = i[1].first
    hash.delete(key) if productName==nameToDelete
  end
end

我不确定在遍历哈希的键值对时从哈希中删除内容是否安全。我查看了 RI 文档,但我没有看到任何有关 Hash 的并发修改。

我知道你可以重写这个

def wipeProduct(hash, nameToDelete) 
  keysToDelete = []
  hash.each do |i| 
    key = i[0]
    productName = i[1].first
    keysToDelete << key if productName==nameToDelete
  end
  keysToDelete.each {|key| hash.delete(key) }
end

甚至:

def wipeProduct(hash, nameToDelete)
  hash.reject!{|key,value| nameToDelete==value.first}
end

但我想知道上面第一个例子中的并发修改是否有问题? (我运行代码的时候好像不是)

问题:有谁知道Hash并发修改的位置是什么? (...和其他集合?)- 如果您愿意,我当然想要任何指向记录此内容的资源的链接。

最佳答案

只要没有其他线程试图访问哈希,任何这些方法都可以。如果有任何其他线程可以访问此哈希,那么这些方法都不是明确的线程安全的。您需要让它们安全运行,只需确保您的方法在散列修改期间获得锁,一切都会顺利进行。

就我个人而言,我会选择破坏性的 reject_if!它是更简洁的代码,无需复制现有代码即可完成相同的事情。

关于ruby - 遍历 ruby​​ Hash 时并发修改,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1684515/

相关文章:

ruby-on-rails - 使用 Mocha 进行模拟实际上如何让您测试函数中的逻辑?

ruby - 从字符串中删除字符串模式和符号

Kotlin:返回只读集合/集合

java - 查找HashMap中存储的字符的索引值

c++ - unordered_set 使用值对象地址的散列

ruby - 用正则表达式替换并捕获

android - Android google io 2011 java源代码中的MAGIC number

java - Linux 命令行 SHA-256 哈希与在线工具不同?

c# - 我如何在 C# 中对字符串进行 SHA512?

ruby - 为什么用ruby查找带有所需文本的节点比使用xpath更快?