Uploaded image for project: 'Bookkeeper'
  1. Bookkeeper
  2. BOOKKEEPER-964

Add concurrent maps and sets for primitive types

    XMLWordPrintableJSON

    Details

    • Type: Improvement
    • Status: Resolved
    • Priority: Major
    • Resolution: Fixed
    • Affects Version/s: None
    • Fix Version/s: 4.5.0
    • Component/s: None
    • Labels:
      None

      Description

      In BookKeeper there are many instances of maps and sets that use ledger id
      and entry ids as keys or values. JDK concurrent collections have the overhead
      of boxing all the primitive values into objects (eg: long --> Long) that would
      need to be allocated from the heap. In addition to that, JDK map implementations
      are closed hash tables and they will require at least one more allocation to hold
      the linked-list/tree node.

      There are already available libraries that offer primitive collections with
      zero-allocation, but none of these support concurrent maps/sets.

      We have added a handful of specializations, all based on the same implementation
      idea. We have a hash table which is broken down into multiple sections. Each
      sections, on its own, is an open hash table with linear probing, protected by
      a stamped lock.

      All insertions, lookups and iterations on these collections are allocation free.

      ConcurrentLongHashMap: Map<long, Object>
      ConcurrentLongHashSet: Set<long>
      ConcurrentLongLongHashMap: Map<long, long>
      ConcurrentLongLongPairHashMap: Map< Pair<long, long>, Pair<long, long> >
      ConcurrentOpenHashMap: Map<Object, Object>
      ConcurrentOpenHashSet: Set<Object>
      

        Attachments

          Activity

            People

            • Assignee:
              mmerli Matteo Merli
              Reporter:
              mmerli Matteo Merli
            • Votes:
              0 Vote for this issue
              Watchers:
              5 Start watching this issue

              Dates

              • Created:
                Updated:
                Resolved: