public class LockFreePrefixTree extends Object
The LockFreePrefixTree supports a single operation root, which returns the root node. The
nodes support the following operations: at to obtain a child node, value to
obtain the value at the current node, setValue to atomically set the value, and
incValue to atomically increment the value.
The LockFreePrefix tree represents a Tree of nodes of classNode, with each node having a
key and an atomic reference array of children. The underlying children structure is
represented as a LinearArray if the number of children is under a threshold, and represented by a
hash table once the threshold is reached.
Any additions or accesses to the datastructure are done using the at function. The
at function takes a key value as a parameter and either returns an already existing node
or inserts a new node and returns it. The function may cause the underlying AtomicReferenceArray
to grow in size, either with tryResizeLinear or tryResizeHash. Insertion of new
nodes is always done with the CAS operation, to ensure atomic updates and guarantee the progress
of at least a single thread in the execution. Additionally, any growth operations occur
atomically, as we perform a CAS with the reference to the Array to a new, freshly allocated array
object.
| Modifier and Type | Class and Description |
|---|---|
static class |
LockFreePrefixTree.Allocator
Policy for allocating objects of the lock-free prefix tree.
|
static class |
LockFreePrefixTree.HeapAllocator
Allocator that allocates objects directly on the managed heap.
|
static class |
LockFreePrefixTree.Node |
static class |
LockFreePrefixTree.ObjectPoolingAllocator
Allocator that internally maintains several pools of preallocated objects, and allocates
objects from those pools.
|
| Constructor and Description |
|---|
LockFreePrefixTree(LockFreePrefixTree.Allocator allocator)
Create new
LockFreePrefixTree with root being a Node with key 0. |
| Modifier and Type | Method and Description |
|---|---|
LockFreePrefixTree.Allocator |
allocator() |
void |
reset()
Resets the tree.
|
LockFreePrefixTree.Node |
root()
The root node of the tree.
|
<C> void |
topDown(C initialContext,
BiFunction<C,Long,C> createContext,
BiConsumer<C,Long> consumeValue)
Traverse the tree top-down while maintaining a context.
|
public LockFreePrefixTree(LockFreePrefixTree.Allocator allocator)
LockFreePrefixTree with root being a Node with key 0.public LockFreePrefixTree.Allocator allocator()
public LockFreePrefixTree.Node root()
public void reset()
public <C> void topDown(C initialContext,
BiFunction<C,Long,C> createContext,
BiConsumer<C,Long> consumeValue)
C - The type of the contextinitialContext - The context for the root of the treecreateContext - A function defining how the context for children is createdconsumeValue - A function that consumes the nodes value