Base trait of all atomic references, no matter the type.
Atomic references wrapping AnyRef
values.
Atomic references wrapping AnyRef
values.
is forced to be an AnyRef
because the equality test is
by reference and not by value.
Atomic references wrapping Boolean
values.
Atomic references wrapping Boolean
values.
Note that the equality test in compareAndSet
is value based,
since Boolean
is a primitive.
For a given T
indicates the most specific Atomic[T]
reference type to use.
For a given T
indicates the most specific Atomic[T]
reference type to use.
In essence this is implementing a form of specialization driven by implicits.
Atomic references wrapping Byte
values.
Atomic references wrapping Byte
values.
Note that the equality test in compareAndSet
is value based,
since Byte
is a primitive.
Atomic references wrapping Char
values.
Atomic references wrapping Char
values.
Note that the equality test in compareAndSet
is value based,
since Char
is a primitive.
Atomic references wrapping Float
values.
Atomic references wrapping Float
values.
Note that the equality test in compareAndSet
is value based,
since Float
is a primitive.
Atomic references wrapping Int
values.
Atomic references wrapping Int
values.
Note that the equality test in compareAndSet
is value based,
since Int
is a primitive.
Atomic references wrapping Long
values.
Atomic references wrapping Long
values.
Note that the equality test in compareAndSet
is value based,
since Long
is a primitive.
Represents an Atomic reference holding a number, providing helpers for easily incrementing and decrementing it.
Represents an Atomic reference holding a number, providing helpers for easily incrementing and decrementing it.
should be something that's Numeric
Atomic references wrapping any values implementing
Scala's Numeric
type-class.
Atomic references wrapping any values implementing
Scala's Numeric
type-class.
Note that the equality test in compareAndSet
is reference based.
This is because we are storing AnyRef
references and on top
of the JVM that's the semantic of compareAndSet
. This behavior
is kept consistent even on top of Scala.js / Javascript.
Atomic references wrapping Short
values.
Atomic references wrapping Short
values.
Note that the equality test in compareAndSet
is value based,
since Short
is a primitive.
For applying padding to atomic references, in order to reduce cache contention.
For applying padding to atomic references, in order to reduce
cache contention. JEP 142 should reduce the need for this along
with the @Contended
annotation, however that might have
security restrictions, the runtime might not act on it since it's
just a recommendation, plus it's nice to provide backwards
compatibility.
See: http://mail.openjdk.java.net/pipermail/hotspot-dev/2012-November/007309.html
The default strategy is NoPadding. In order to apply padding:
import monix.execution.atomic.Atomic import monix.execution.atomic.PaddingStrategy.Right64 val paddedAtomic = Atomic.withPadding(10, Right64)
A small toolkit of classes that support compare-and-swap semantics for safe mutation of variables.
On top of the JVM, this means dealing with lock-free thread-safe programming. Also works on top of Javascript, with Scala.js, for API compatibility purposes and because it's a useful way to box a value.
The backbone of Atomic references is this method:
This method atomically sets a variable to the
update
value if it currently holds theexpect
value, reportingtrue
on success orfalse
on failure. The classes in this package also contain methods to get and unconditionally set values.Building a reference is easy with the provided constructor, which will automatically return the most specific type needed (in the following sample, that's an
AtomicDouble
, inheriting fromAtomicNumber[T]
):These also provide useful helpers for atomically mutating of values (i.e.
transform
,transformAndGet
,getAndTransform
, etc...) or of numbers of any kind (incrementAndGet
,getAndAdd
, etc...).