Package com.codahale.metrics
Class Striped64
java.lang.Object
java.lang.Number
com.codahale.metrics.Striped64
- All Implemented Interfaces:
Serializable
- Direct Known Subclasses:
LongAdder
A package-local class holding common representation and mechanics for classes supporting dynamic
striping on 64bit values. The class extends Number so that concrete subclasses must publicly do
so.
-
Nested Class Summary
Nested ClassesModifier and TypeClassDescription(package private) static final class
Padded variant of AtomicLong supporting only raw accesses plus CAS.(package private) static final class
Holder for the thread-local hash code.(package private) static final class
The corresponding ThreadLocal class -
Field Summary
FieldsModifier and TypeFieldDescription(package private) long
Base value, used mainly when there is no contention, but also as a fallback during table initialization races.private static final long
(package private) int
Spinlock (locked via CAS) used when resizing and/or creating Cells.private static final long
(package private) Striped64.Cell[]
Table of cells.(package private) static final int
Number of CPUS, to place bound on table size(package private) static final Striped64.ThreadHashCode
Static per-thread hash codes.private static final sun.misc.Unsafe
-
Constructor Summary
Constructors -
Method Summary
Modifier and TypeMethodDescription(package private) final boolean
casBase
(long cmp, long val) CASes the base field.(package private) final boolean
casBusy()
CASes the busy field from 0 to 1 to acquire lock.(package private) abstract long
fn
(long currentValue, long newValue) Computes the function of current and new value.private static sun.misc.Unsafe
Returns a sun.misc.Unsafe.(package private) final void
internalReset
(long initialValue) Sets base and all cells to the given value.(package private) final void
retryUpdate
(long x, Striped64.HashCode hc, boolean wasUncontended) Handles cases of updates involving initialization, resizing, creating new Cells, and/or contention.Methods inherited from class java.lang.Number
byteValue, doubleValue, floatValue, intValue, longValue, shortValue
-
Field Details
-
threadHashCode
Static per-thread hash codes. Shared across all instances to reduce ThreadLocal pollution and because adjustments due to collisions in one table are likely to be appropriate for others. -
NCPU
static final int NCPUNumber of CPUS, to place bound on table size -
cells
Table of cells. When non-null, size is a power of 2. -
base
transient volatile long baseBase value, used mainly when there is no contention, but also as a fallback during table initialization races. Updated via CAS. -
busy
transient volatile int busySpinlock (locked via CAS) used when resizing and/or creating Cells. -
UNSAFE
private static final sun.misc.Unsafe UNSAFE -
baseOffset
private static final long baseOffset -
busyOffset
private static final long busyOffset
-
-
Constructor Details
-
Striped64
Striped64()Package-private default constructor
-
-
Method Details
-
casBase
final boolean casBase(long cmp, long val) CASes the base field. -
casBusy
final boolean casBusy()CASes the busy field from 0 to 1 to acquire lock. -
fn
abstract long fn(long currentValue, long newValue) Computes the function of current and new value. Subclasses should open-code this update function for most uses, but the virtualized form is needed within retryUpdate.- Parameters:
currentValue
- the current value (of either base or a cell)newValue
- the argument from a user update call- Returns:
- result of the update function
-
retryUpdate
Handles cases of updates involving initialization, resizing, creating new Cells, and/or contention. See above for explanation. This method suffers the usual non-modularity problems of optimistic retry code, relying on rechecked sets of reads.- Parameters:
x
- the valuehc
- the hash code holderwasUncontended
- false if CAS failed before call
-
internalReset
final void internalReset(long initialValue) Sets base and all cells to the given value. -
getUnsafe
private static sun.misc.Unsafe getUnsafe()Returns a sun.misc.Unsafe. Suitable for use in a 3rd party package. Replace with a simple call to Unsafe.getUnsafe when integrating into a jdk.- Returns:
- a sun.misc.Unsafe
-