The type of the concrete implementation, e.g.
The type of the concrete implementation, e.g. GSet[A]
.
To be specified by subclass.
Java API
Monotonic merge function.
Monotonic merge function.
The current value
was set by this node.
Change the value of the register.
Change the value of the register.
Change the value of the register.
You can provide your clock
implementation instead of using timestamps based
on System.currentTimeMillis()
time. The timestamp can for example be an
increasing version number from a database record that is used for optimistic
concurrency control.
Change the value of the register.
Change the value of the register.
You can provide your clock
implementation instead of using timestamps based
on System.currentTimeMillis()
time. The timestamp can for example be an
increasing version number from a database record that is used for optimistic
concurrency control.
(Since version 2.5.20) Use withValue
that takes a SelfUniqueAddress
parameter instead.
(Since version 2.5.20) Use withValue
that takes a SelfUniqueAddress
parameter instead.
(Since version 2.5.20) Use withValueOf
that takes a SelfUniqueAddress
parameter instead.
Implements a 'Last Writer Wins Register' CRDT, also called a 'LWW-Register'.
It is described in the paper A comprehensive study of Convergent and Commutative Replicated Data Types.
Merge takes the register with highest timestamp. Note that this relies on synchronized clocks.
LWWRegister
should only be used when the choice of value is not important for concurrent updates occurring within the clock skew.Merge takes the register updated by the node with lowest address (
UniqueAddress
is ordered) if the timestamps are exactly the same.Instead of using timestamps based on
System.currentTimeMillis()
time it is possible to use a timestamp value based on something else, for example an increasing version number from a database record that is used for optimistic concurrency control.The
defaultClock
is using max value ofSystem.currentTimeMillis()
andcurrentTimestamp + 1
. This means that the timestamp is increased for changes on the same node that occurs within the same millisecond. It also means that it is safe to use theLWWRegister
without synchronized clocks when there is only one active writer, e.g. a Cluster Singleton. Such a single writer should then first read current value withReadMajority
(or more) before changing and writing the value withWriteMajority
(or more).For first-write-wins semantics you can use the LWWRegister#reverseClock instead of the LWWRegister#defaultClock
This class is immutable, i.e. "modifying" methods return a new instance.