2009-11-05 22 views
4

假設你有如下:併發修改,同時穿越紅寶石哈希

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

我不知道它是安全的,而你遍歷哈希的鍵值對從散列中刪除的東西。我檢查了RI文檔,但是我沒有看到有關哈希上的併發修改的任何內容。

我知道,你也可以重寫此

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 

,但我想知道的,如圖中的第一個例子上面是一個問題,如果併發的修改? (它似乎不是當我運行代碼時)

問題:有人知道什麼位置併發修改與哈希? (...和其他集合?) - 如果你願意的話,我一定會喜歡任何資源鏈接。

回答

1

只要沒有其他線程試圖訪問哈希,任何這些方法都很好。如果有其他線程可以訪問這個哈希,那麼這些方法都不是線程安全的。你需要讓它們更安全,只要確保你的方法在修改哈希的過程中獲得了一個鎖,並且事情會很好。

就我個人而言,我會與破壞性reject_if!它更簡潔的代碼,完成同樣的事情,而不需要複製現有的代碼。