1

私がやりたいことは、 a の実装を使用して開始しMap、並列コレクションを反復処理してデータを蓄積することです。キーは確率的に生成されるため (乱数の生成に関連)、スレッド間でキーが「重複」する可能性があります。

元。スレッド 1 は、キー = A 値 = 1 をマップに追加しようとしています。すでに存在する場合は、既存の値に 1 を追加します (値が 1 であるため)。存在しない場合は、マッピングを作成します。一方、別のスレッドはキー = A と値 = 2 を持ち、同じことをしたいと考えています。

システム全体を作成せずにこれを行う方法はありActorますか?

ConcurrentHashMapJavaのライブラリからのものは興味深いように見えますが、「弱い一貫性のある」イテレータは、スレッド間でマップを更新することの安全性に関して私を悩ませています..

4

1 に答える 1

7

これは、アクターなしで行うのは非常に簡単なことです。

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 に答える