Package org.jruby.util.collections
Class ConcurrentAutoTable
java.lang.Object
org.jruby.util.collections.ConcurrentAutoTable
- All Implemented Interfaces:
Serializable
- Direct Known Subclasses:
Counter
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
-
Nested Class Summary
Nested Classes -
Field Summary
FieldsModifier and TypeFieldDescriptionprivate ConcurrentAutoTable.CATprivate static final AtomicReferenceFieldUpdater<ConcurrentAutoTable,ConcurrentAutoTable.CAT> -
Constructor Summary
Constructors -
Method Summary
Modifier and TypeMethodDescriptionvoidadd(long x) Add the given value to current counter value.private longadd_if_mask(long x, long mask) private booleanCAS_cat(ConcurrentAutoTable.CAT oldcat, ConcurrentAutoTable.CAT newcat) voidadd(long)with -1longA cheaperget().longget()Current value of the counter.private static final inthash()voidadd(long)with +1intReturn the internal counter striping factor.intintValue()Same asget(), included for completeness.longSame asget(), included for completeness.voidset(long x) Atomically set the sum of the striped counters to specified value.toString()Return the counter'slongvalue converted to a string.
-
Field Details
-
_cat
-
_catUpdater
private static final AtomicReferenceFieldUpdater<ConcurrentAutoTable,ConcurrentAutoTable.CAT> _catUpdater
-
-
Constructor Details
-
ConcurrentAutoTable
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 asget(), included for completeness. -
longValue
public long longValue()Same asget(), included for completeness. -
estimate_get
public long estimate_get()A cheaperget(). Updated only once/millisecond, but as fast as a simple load instruction when not updating. -
toString
Return the counter'slongvalue converted to a string. -
internal_size
public int internal_size()Return the internal counter striping factor. Useful for diagnosing performance problems. -
add_if_mask
private long add_if_mask(long x, long mask) -
CAS_cat
-
hash
private static final int hash()
-