Class ConcurrentAutoTable

java.lang.Object
zombie.core.Collections.ConcurrentAutoTable
All Implemented Interfaces:
Serializable
Direct Known Subclasses:
Counter

public class ConcurrentAutoTable extends Object implements Serializable
An auto-resizing table of longs, supporting low-contention CAS operations. Updates are done with CAS's to no particular table element. The intent is to support highly scalable counters, r/w locks, and other structures where the updates are associative, loss-free (no-brainer), and otherwise happen at such a high volume that the cache contention for CAS'ing a single word is unacceptable.

This API is overkill for simple counters (e.g. no need for the 'mask') and is untested as an API for making a scalable r/w lock and so is likely to change!

Since:
1.5
See Also:
  • Constructor Details

    • ConcurrentAutoTable

      public ConcurrentAutoTable()
  • Method Details

    • add

      public void add(long x)
      Add the given value to current counter value. Concurrent updates will not be lost, but addAndGet or getAndAdd are not implemented because the total counter value (i.e., get()) is not atomically updated. Updates are striped across an array of counters to avoid cache contention and has been tested with performance scaling linearly up to 768 CPUs.
    • decrement

      public void decrement()
      add(long) with -1
    • increment

      public void increment()
      add(long) with +1
    • set

      public void set(long x)
      Atomically set the sum of the striped counters to specified value. Rather more expensive than a simple store, in order to remain atomic.
    • get

      public long get()
      Current value of the counter. Since other threads are updating furiously the value is only approximate, but it includes all counts made by the current thread. Requires a pass over the internally striped counters.
    • intValue

      public int intValue()
      Same as get(), included for completeness.
    • longValue

      public long longValue()
      Same as get(), included for completeness.
    • estimate_get

      public long estimate_get()
      A cheaper get(). Updated only once/millisecond, but as fast as a simple load instruction when not updating.
    • toString

      public String toString()
      Return the counter's long value converted to a string.
      Overrides:
      toString in class Object
    • print

      public void print()
      A more verbose print than toString(), showing internal structure. Useful for debugging.
    • internal_size

      public int internal_size()
      Return the internal counter striping factor. Useful for diagnosing performance problems.