Provides access to a single element of type ''A''. Accesses are
performed as part of a ''memory transaction'' that comprises all of the
operations of an atomic block and any nested blocks. Single-operation
memory transactions may be performed without an explicit atomic block using
the Ref.View
returned from single
. The software transactional memory
performs concurrency control to make sure that all committed transactions
are linearizable. Reads and writes performed by a successful transaction
return the same values as if they were executed instantaneously at the
transaction's commit (linearization) point.
Provides access to a single element of type ''A''. Accesses are
performed as part of a ''memory transaction'' that comprises all of the
operations of an atomic block and any nested blocks. Single-operation
memory transactions may be performed without an explicit atomic block using
the Ref.View
returned from single
. The software transactional memory
performs concurrency control to make sure that all committed transactions
are linearizable. Reads and writes performed by a successful transaction
return the same values as if they were executed instantaneously at the
transaction's commit (linearization) point.
The static scope of an atomic block is defined by access to an implicit
InTxn
passed to the block by the STM. Atomic blocks nest, so to
participate in an atomic block for which a InTxn
is not conveniently
available, just create a new atomic block using
atomic { implicit t =>
// the body
}
In the static scope of an atomic block reads and writes of a Ref
are performed by x.get
and x.set(v)
, or more concisely by x()
and
x() = v
. x.single
returns a Ref.View
that will dynamically resolve
the current scope during each method call, automatically creating a
single-operation atomic block if no transaction is active.
It is possible for separate Ref
instances to refer to the same element;
in this case they will compare equal. (As an example, a transactional
array class might store elements in an array and create Ref
s on demand.)
Ref
s may be provided for computed values, such as the emptiness of a
queue, to allow conditional retry and waiting on semantic properties.
To perform an access outside a transaction, use the view returned by
single
. Each access through the returned view will act as if it was
performed in its own single-operation transaction, dynamically nesting into
an active atomic block as appropriate.
Ref
's companion object contains factory methods that create Ref
instances paired with a single STM-managed memory location.
- Authors
Nathan Bronson
- Companion
- object
Value members
Abstract methods
Returns a Ref.View
that allows access to the contents of this Ref
without requiring that a InTxn
be available. Each operation on the view
will act as if it is performed in its own "single-operation" atomic
block, nesting into an existing transaction if one is active.
Returns a Ref.View
that allows access to the contents of this Ref
without requiring that a InTxn
be available. Each operation on the view
will act as if it is performed in its own "single-operation" atomic
block, nesting into an existing transaction if one is active.
A mental model of this method is that ref.single.foo(args)
acts like
atomic { implicit t => ref.foo(args) }
.
- Definition Classes
Inherited methods
Transforms the value stored in the Ref
by multiplying it.
Transforms the value stored in the Ref
by multiplying it.
'''Note: Implementations may choose to ignore the provided Numeric[A]
instance if A
is a primitive type.'''
- Value Params
- rhs
the quantity by which to multiply the value of this
Ref
.
- Throws
- IllegalStateException
if
txn
is not active.
- Inherited from
- RefLike
Transforms the value stored in the Ref
by incrementing it.
Transforms the value stored in the Ref
by incrementing it.
'''Note: Implementations may choose to ignore the provided Numeric[A]
instance if A
is a primitive type.'''
- Value Params
- rhs
the quantity by which to increment the value of this
Ref
.
- Throws
- IllegalStateException
if
txn
is not active.
- Inherited from
- RefLike
Transforms the value stored in the Ref
by decrementing it.
Transforms the value stored in the Ref
by decrementing it.
'''Note: Implementations may choose to ignore the provided Numeric[A]
instance if A
is a primitive type.'''
- Value Params
- rhs
the quantity by which to decrement the value of this
Ref
.
- Throws
- IllegalStateException
if
txn
is not active.
- Inherited from
- RefLike
Transforms the value stored the Ref
by performing a division on it,
throwing away the remainder if division is not exact for instances of
type A
. The careful reader will note that division is actually
provided by Fractional[A]
or Integral[A]
, it is not defined on
Numeric[A]
. To avoid compile-time ambiguity this method accepts a
Numeric[A]
and assumes that it can be converted at runtime into
either a Fractional[A]
or an Integral[A]
.
Transforms the value stored the Ref
by performing a division on it,
throwing away the remainder if division is not exact for instances of
type A
. The careful reader will note that division is actually
provided by Fractional[A]
or Integral[A]
, it is not defined on
Numeric[A]
. To avoid compile-time ambiguity this method accepts a
Numeric[A]
and assumes that it can be converted at runtime into
either a Fractional[A]
or an Integral[A]
.
'''Note: Implementations may choose to ignore the provided Numeric[A]
instance if A
is a primitive type.'''
- Value Params
- rhs
the quantity by which to divide the value of this
Ref
.
- Throws
- IllegalStateException
if
txn
is not active.
- Inherited from
- RefLike
Performs a transactional read and checks that it is consistent with all
reads already made by txn
. Equivalent to get
.
Performs a transactional read and checks that it is consistent with all
reads already made by txn
. Equivalent to get
.
Example:
val x = Ref(0)
atomic { implicit t =>
...
val v = x() // perform a read inside a transaction
...
}
- Value Params
- txn
an active transaction.
- Returns
the value of the
Ref
as observed bytxn
.- Throws
- IllegalStateException
if
txn
is not active.
- Inherited from
- SourceLike
Performs a transactional read and checks that it is consistent with all
reads already made by txn
. Equivalent to apply()
, which is more
concise in many situations.
Performs a transactional read and checks that it is consistent with all
reads already made by txn
. Equivalent to apply()
, which is more
concise in many situations.
- Value Params
- txn
an active transaction.
- Returns
the value of the
Ref
as observed bytxn
.- Throws
- IllegalStateException
if
txn
is not active.
- Inherited from
- SourceLike
Transforms the value referenced by this Ref
by applying the function
f
, and returns the previous value.
Transforms the value referenced by this Ref
by applying the function
f
, and returns the previous value.
- Value Params
- f
a function that is safe to call multiple times.
- Returns
the previous value of this
Ref
(the value passed tof
).- Throws
- IllegalStateException
if
txn
is not active.
- Inherited from
- RefLike
Returns f(get)
, possibly reevaluating f
to avoid rollback if a
conflicting change is made but the old and new values are equal after
application of f
. Requires that f(x) == f(y)
if x == y
.
Returns f(get)
, possibly reevaluating f
to avoid rollback if a
conflicting change is made but the old and new values are equal after
application of f
. Requires that f(x) == f(y)
if x == y
.
getWith(f)
is equivalent to f(relaxedGet({ f(_) == f(_) }))
, although
perhaps more efficient.
- Value Params
- f
an idempotent function.
- Returns
the result of applying
f
to the value contained in thisRef
.- Inherited from
- SourceLike
Returns the same value as get
, but allows the caller to determine
whether txn
should be rolled back if another thread changes the value
of this Ref
before txn
is committed. If ref.relaxedGet(equiv)
returns v0
in txn
, another context changes ref
to v1
, and
equiv(v0, v1) == true
, then txn
won't be required to roll back (at
least not due to this read). If additional changes are made to ref
additional calls to the equivalence function will be made, always with
v0
as the first parameter.
Returns the same value as get
, but allows the caller to determine
whether txn
should be rolled back if another thread changes the value
of this Ref
before txn
is committed. If ref.relaxedGet(equiv)
returns v0
in txn
, another context changes ref
to v1
, and
equiv(v0, v1) == true
, then txn
won't be required to roll back (at
least not due to this read). If additional changes are made to ref
additional calls to the equivalence function will be made, always with
v0
as the first parameter.
equiv
will always be invoked on the current thread. Extreme care
should be taken if the equivalence function accesses any Ref
s.
As an example, to perform a read that will not be validated during commit you can use the maximally permissive equivalence function:
val unvalidatedValue = ref.relaxedGet({ (_, _) => true })
To check view serializability rather than conflict serializability for a read:
val viewSerializableValue = ref.relaxedGet({ _ == _ })
The getWith
method provides related functionality.
- Value Params
- equiv
an equivalence function that returns true if a transaction that observed the first argument will still complete correctly, where the second argument is the actual value that should have been observed.
- Returns
a value of the
Ref
, not necessary consistent with the rest of the reads performed bytxn
.- Inherited from
- SourceLike
Performs a transactional write. The new value will not be visible by
any other threads until (and unless) txn
successfully commits.
Equivalent to update(v)
.
Performs a transactional write. The new value will not be visible by
any other threads until (and unless) txn
successfully commits.
Equivalent to update(v)
.
- Value Params
- v
a value to store in the
Ref
.
- Throws
- IllegalStateException
if
txn
is not active.
- Inherited from
- SinkLike
Works like set(v)
, but returns the old value.
Works like set(v)
, but returns the old value.
- Returns
the previous value of this
Ref
, as observed bytxn
.- Throws
- IllegalStateException
if
txn
is not active.
- Inherited from
- RefLike
Transforms the value referenced by this Ref
by applying the function
f
. Acts like ref.set(f(ref.get))
, but the execution of f
may be
deferred or repeated by the STM to reduce transaction conflicts.
Transforms the value referenced by this Ref
by applying the function
f
. Acts like ref.set(f(ref.get))
, but the execution of f
may be
deferred or repeated by the STM to reduce transaction conflicts.
- Value Params
- f
a function that is safe to call multiple times, and safe to call later during the transaction.
- Throws
- IllegalStateException
if
txn
is not active.
- Inherited from
- RefLike
Transforms the value referenced by this Ref
from ''v'' to
f
(''v'')._1
, and returns f
(''v'')._2
.
Transforms the value referenced by this Ref
from ''v'' to
f
(''v'')._1
, and returns f
(''v'')._2
.
- Value Params
- f
a function that is safe to call multiple times.
- Returns
the second element of the pair returned by
f
.- Throws
- IllegalStateException
if
txn
is not active.
- Inherited from
- RefLike
Transforms the value referenced by this Ref
by applying the function
f
, and returns the new value.
Transforms the value referenced by this Ref
by applying the function
f
, and returns the new value.
- Value Params
- f
a function that is safe to call multiple times.
- Returns
the new value of this
Ref
(the value returned fromf
).- Throws
- IllegalStateException
if
txn
is not active.
- Inherited from
- RefLike
Transforms the value ''v'' referenced by this Ref
by to
pf.apply
(''v''), but only if pf.isDefinedAt
(''v''). Returns true if
a transformation was performed, false otherwise. pf.apply
and
pf.isDefinedAt
may be deferred or repeated by the STM to reduce
transaction conflicts.
Transforms the value ''v'' referenced by this Ref
by to
pf.apply
(''v''), but only if pf.isDefinedAt
(''v''). Returns true if
a transformation was performed, false otherwise. pf.apply
and
pf.isDefinedAt
may be deferred or repeated by the STM to reduce
transaction conflicts.
- Value Params
- pf
a partial function that is safe to call multiple times, and safe to call later in the transaction.
- Returns
pf.isDefinedAt(v)
, wherev
was the value of thisRef
before transformation (if any).- Throws
- IllegalStateException
if
txn
is not active.
- Inherited from
- RefLike
Performs a transactional write and returns true, or returns false. The STM implementation may choose to return false to reduce (not necessarily avoid) blocking. If no other threads are performing any transactional or atomic accesses then this method will succeed.
Performs a transactional write and returns true, or returns false. The STM implementation may choose to return false to reduce (not necessarily avoid) blocking. If no other threads are performing any transactional or atomic accesses then this method will succeed.
- Inherited from
- SinkLike
Performs a transactional write. The new value will not be visible by
any other threads until (and unless) txn
successfully commits.
Equivalent to set(v)
.
Performs a transactional write. The new value will not be visible by
any other threads until (and unless) txn
successfully commits.
Equivalent to set(v)
.
Example:
val x = Ref(0)
atomic { implicit t =>
...
x() = 10 // perform a write inside a transaction
...
}
- Value Params
- v
a value to store in the
Ref
.
- Throws
- IllegalStateException
if
txn
is not active.
- Inherited from
- SinkLike