1

我想要做的是开始使用 a 的一些实现,Map并通过迭代并行集合将数据累积到其中。密钥可以在线程之间“重叠”,因为密钥是概率生成的(与随机数生成有关)。

前任。线程 1 想要将 key = A value = 1 添加到映射中。如果它已经存在,则将 1 添加到现有值(因为值是 1) - 如果不存在,则创建映射。同时,另一个线程有 key = A 和 value = 2,并且想做同样的事情。

有没有办法在不创建整个Actor系统的情况下做到这一点?

ConcurrentHashMap来自 Java 的库似乎看起来很有趣,但是“弱一致性”迭代器让我担心跨线程更新映射的安全性。

4

1 回答 1

7

如果没有 Actors,这是一件非常微不足道的事情。

class CountMap[K <: AnyRef](mapSize: Int = 16) extends ConcurrentHashMap[K, AtomicLong](mapSize) {
  def addCount(key: K): Long = (get(key) match { // Check value for key
    case null =>  // If not mapped yet
      val al = new AtomicLong(0) // Create a new memory slot to keep the count in that is thread safe
      putIfAbsent(key, al) match { // Try to put our memory slot in atomically
        case null => al // If we succeeded then our memory slot should be used
        case some => some // if there already was a memory slot, use that one
      }
    case some => some // If there already was a memory slot, use that one
    }).incrementAndGet() // increment and get the current value of the slot associated with the given key

  def getCount(key: K): Long = get(key) match { // get the memory slot associated with the key
    case null => 0L // if none, say it's 0
    case some => some.get() // if some get its value
  }
}
于 2012-07-16T18:47:36.903 回答