trait Ref[A] extends RefLike[A, InTxn] with Source[A] with Sink[A]
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.
- Alphabetic
- By Inheritance
- Ref
- Sink
- Source
- TxnDebuggable
- RefLike
- SinkLike
- SourceLike
- AnyRef
- Any
- Hide All
- Show All
- Public
- All
Abstract Value Members
-
abstract
def
get(implicit txn: InTxn): A
Performs a transactional read and checks that it is consistent with all reads already made by
txn
.Performs a transactional read and checks that it is consistent with all reads already made by
txn
. Equivalent toapply()
, which is more concise in many situations.- txn
an active transaction.
- returns
the value of the
Ref
as observed bytxn
.
- Definition Classes
- SourceLike
- Exceptions thrown
IllegalStateException
iftxn
is not active.
-
abstract
def
getWith[Z](f: (A) ⇒ Z)(implicit txn: InTxn): Z
Returns
f(get)
, possibly reevaluatingf
to avoid rollback if a conflicting change is made but the old and new values are equal after application off
.Returns
f(get)
, possibly reevaluatingf
to avoid rollback if a conflicting change is made but the old and new values are equal after application off
. Requires thatf(x) == f(y)
ifx == y
.getWith(f)
is equivalent tof(relaxedGet({ f(_) == f(_) }))
, although perhaps more efficient.- f
an idempotent function.
- returns
the result of applying
f
to the value contained in thisRef
.
- Definition Classes
- SourceLike
-
abstract
def
relaxedGet(equiv: (A, A) ⇒ Boolean)(implicit txn: InTxn): A
Returns the same value as
get
, but allows the caller to determine whethertxn
should be rolled back if another thread changes the value of thisRef
beforetxn
is committed.Returns the same value as
get
, but allows the caller to determine whethertxn
should be rolled back if another thread changes the value of thisRef
beforetxn
is committed. Ifref.relaxedGet(equiv)
returnsv0
intxn
, another context changesref
tov1
, andequiv(v0, v1) == true
, thentxn
won't be required to roll back (at least not due to this read). If additional changes are made toref
additional calls to the equivalence function will be made, always withv0
as the first parameter.equiv
will always be invoked on the current thread. Extreme care should be taken if the equivalence function accesses anyRef
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.- 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
.
- Definition Classes
- SourceLike
-
abstract
def
set(v: A)(implicit txn: InTxn): Unit
Performs a transactional write.
Performs a transactional write. The new value will not be visible by any other threads until (and unless)
txn
successfully commits. Equivalent toupdate(v)
.- v
a value to store in the
Ref
.
- Definition Classes
- SinkLike
- Exceptions thrown
IllegalStateException
iftxn
is not active.
-
abstract
def
single: View[A]
Returns a
Ref.View
that allows access to the contents of thisRef
without requiring that aInTxn
be available.Returns a
Ref.View
that allows access to the contents of thisRef
without requiring that aInTxn
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 likeatomic { implicit t => ref.foo(args) }
. -
abstract
def
swap(v: A)(implicit txn: InTxn): A
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
.
- Definition Classes
- RefLike
- Exceptions thrown
IllegalStateException
iftxn
is not active.
-
abstract
def
transform(f: (A) ⇒ A)(implicit txn: InTxn): Unit
Transforms the value referenced by this
Ref
by applying the functionf
.Transforms the value referenced by this
Ref
by applying the functionf
. Acts likeref.set(f(ref.get))
, but the execution off
may be deferred or repeated by the STM to reduce transaction conflicts.- f
a function that is safe to call multiple times, and safe to call later during the transaction.
- Definition Classes
- RefLike
- Exceptions thrown
IllegalStateException
iftxn
is not active.
-
abstract
def
transformIfDefined(pf: PartialFunction[A, A])(implicit txn: InTxn): Boolean
Transforms the value v referenced by this
Ref
by topf.apply
(v), but only ifpf.isDefinedAt
(v).Transforms the value v referenced by this
Ref
by topf.apply
(v), but only ifpf.isDefinedAt
(v). Returns true if a transformation was performed, false otherwise.pf.apply
andpf.isDefinedAt
may be deferred or repeated by the STM to reduce transaction conflicts.- 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).
- Definition Classes
- RefLike
- Exceptions thrown
IllegalStateException
iftxn
is not active.
-
abstract
def
trySet(v: A)(implicit txn: InTxn): Boolean
Performs a transactional write and returns true, or returns false.
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.
- Definition Classes
- SinkLike
Concrete Value Members
-
final
def
!=(arg0: Any): Boolean
- Definition Classes
- AnyRef → Any
-
final
def
##(): Int
- Definition Classes
- AnyRef → Any
-
def
*=(rhs: A)(implicit txn: InTxn, num: Numeric[A]): Unit
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 ifA
is a primitive type.- rhs
the quantity by which to multiply the value of this
Ref
.
- Definition Classes
- RefLike
- Exceptions thrown
IllegalStateException
iftxn
is not active.
-
def
+=(rhs: A)(implicit txn: InTxn, num: Numeric[A]): Unit
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 ifA
is a primitive type.- rhs
the quantity by which to increment the value of this
Ref
.
- Definition Classes
- RefLike
- Exceptions thrown
IllegalStateException
iftxn
is not active.
-
def
-=(rhs: A)(implicit txn: InTxn, num: Numeric[A]): Unit
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 ifA
is a primitive type.- rhs
the quantity by which to decrement the value of this
Ref
.
- Definition Classes
- RefLike
- Exceptions thrown
IllegalStateException
iftxn
is not active.
-
def
/=(rhs: A)(implicit txn: InTxn, num: Numeric[A]): Unit
Transforms the value stored the
Ref
by performing a division on it, throwing away the remainder if division is not exact for instances of typeA
.Transforms the value stored the
Ref
by performing a division on it, throwing away the remainder if division is not exact for instances of typeA
. The careful reader will note that division is actually provided byFractional[A]
orIntegral[A]
, it is not defined onNumeric[A]
. To avoid compile-time ambiguity this method accepts aNumeric[A]
and assumes that it can be converted at runtime into either aFractional[A]
or anIntegral[A]
.Note: Implementations may choose to ignore the provided
Numeric[A]
instance ifA
is a primitive type.- rhs
the quantity by which to divide the value of this
Ref
.
- Definition Classes
- RefLike
- Exceptions thrown
IllegalStateException
iftxn
is not active.
-
final
def
==(arg0: Any): Boolean
- Definition Classes
- AnyRef → Any
-
def
apply()(implicit txn: InTxn): A
Performs a transactional read and checks that it is consistent with all reads already made by
txn
.Performs a transactional read and checks that it is consistent with all reads already made by
txn
. Equivalent toget
.Example:
val x = Ref(0) atomic { implicit t => ... val v = x() // perform a read inside a transaction ... }
- txn
an active transaction.
- returns
the value of the
Ref
as observed bytxn
.
- Definition Classes
- SourceLike
- Exceptions thrown
IllegalStateException
iftxn
is not active.
-
final
def
asInstanceOf[T0]: T0
- Definition Classes
- Any
-
def
clone(): AnyRef
- Attributes
- protected[java.lang]
- Definition Classes
- AnyRef
- Annotations
- @throws( ... )
-
def
dbgStr: String
Returns a string representation of the transactional value in this instance for debugging convenience.
Returns a string representation of the transactional value in this instance for debugging convenience. The
Ref
reads (and writes) performed while constructing the result will be discarded before returning. This method works fine outside a transaction.If this method is called from within a transaction that is already doomed (status
Txn.Rolledback
), a string describing the reason for the outer transaction's rollback will be returned.- Definition Classes
- Source → TxnDebuggable
-
def
dbgValue: Any
Returns some value that is suitable for examination in a debugger, or returns a
Txn.RollbackCause
if called from inside a doomed atomic block.Returns some value that is suitable for examination in a debugger, or returns a
Txn.RollbackCause
if called from inside a doomed atomic block.- Definition Classes
- Source → TxnDebuggable
-
final
def
eq(arg0: AnyRef): Boolean
- Definition Classes
- AnyRef
-
def
equals(arg0: Any): Boolean
- Definition Classes
- AnyRef → Any
-
def
finalize(): Unit
- Attributes
- protected[java.lang]
- Definition Classes
- AnyRef
- Annotations
- @throws( classOf[java.lang.Throwable] )
-
def
getAndTransform(f: (A) ⇒ A)(implicit txn: InTxn): A
Transforms the value referenced by this
Ref
by applying the functionf
, and returns the previous value.Transforms the value referenced by this
Ref
by applying the functionf
, and returns the previous value.- f
a function that is safe to call multiple times.
- returns
the previous value of this
Ref
(the value passed tof
).
- Definition Classes
- RefLike
- Exceptions thrown
IllegalStateException
iftxn
is not active.
-
final
def
getClass(): Class[_]
- Definition Classes
- AnyRef → Any
-
def
hashCode(): Int
- Definition Classes
- AnyRef → Any
-
final
def
isInstanceOf[T0]: Boolean
- Definition Classes
- Any
-
final
def
ne(arg0: AnyRef): Boolean
- Definition Classes
- AnyRef
-
final
def
notify(): Unit
- Definition Classes
- AnyRef
-
final
def
notifyAll(): Unit
- Definition Classes
- AnyRef
-
final
def
synchronized[T0](arg0: ⇒ T0): T0
- Definition Classes
- AnyRef
-
def
toString(): String
- Definition Classes
- AnyRef → Any
-
def
transformAndExtract[B](f: (A) ⇒ (A, B))(implicit txn: InTxn): B
Transforms the value referenced by this
Ref
from v tof
(v)._1
, and returnsf
(v)._2
.Transforms the value referenced by this
Ref
from v tof
(v)._1
, and returnsf
(v)._2
.- f
a function that is safe to call multiple times.
- returns
the second element of the pair returned by
f
.
- Definition Classes
- RefLike
- Exceptions thrown
IllegalStateException
iftxn
is not active.
-
def
transformAndGet(f: (A) ⇒ A)(implicit txn: InTxn): A
Transforms the value referenced by this
Ref
by applying the functionf
, and returns the new value.Transforms the value referenced by this
Ref
by applying the functionf
, and returns the new value.- f
a function that is safe to call multiple times.
- returns
the new value of this
Ref
(the value returned fromf
).
- Definition Classes
- RefLike
- Exceptions thrown
IllegalStateException
iftxn
is not active.
-
def
update(v: A)(implicit txn: InTxn): Unit
Performs a transactional write.
Performs a transactional write. The new value will not be visible by any other threads until (and unless)
txn
successfully commits. Equivalent toset(v)
.Example:
val x = Ref(0) atomic { implicit t => ... x() = 10 // perform a write inside a transaction ... }
- v
a value to store in the
Ref
.
- Definition Classes
- SinkLike
- Exceptions thrown
IllegalStateException
iftxn
is not active.
-
final
def
wait(): Unit
- Definition Classes
- AnyRef
- Annotations
- @throws( ... )
-
final
def
wait(arg0: Long, arg1: Int): Unit
- Definition Classes
- AnyRef
- Annotations
- @throws( ... )
-
final
def
wait(arg0: Long): Unit
- Definition Classes
- AnyRef
- Annotations
- @throws( ... )