Package org.jboss.logmanager
Class AtomicArray<T,V>
- java.lang.Object
-
- org.jboss.logmanager.AtomicArray<T,V>
-
- Type Parameters:
T- the type which contains the target fieldV- the array value type
final class AtomicArray<T,V> extends java.lang.ObjectUtility for snapshot/copy-on-write arrays. To use these methods, two things are required: an immutable array stored on a volatile field, and an instance ofAtomicReferenceFieldUpdaterwhich corresponds to that field. Some of these methods perform multi-step operations; if the array field value is changed in the middle of such an operation, the operation is retried. To avoid spinning, in some situations it may be advisable to hold a write lock to prevent multiple concurrent updates.
-
-
Field Summary
Fields Modifier and Type Field Description private java.lang.Class<V>componentTypeprivate V[]emptyArrayprivate java.util.concurrent.atomic.AtomicReferenceFieldUpdater<T,V[]>updater
-
Constructor Summary
Constructors Constructor Description AtomicArray(java.util.concurrent.atomic.AtomicReferenceFieldUpdater<T,V[]> updater, java.lang.Class<V> componentType)Construct an instance.
-
Method Summary
All Methods Static Methods Instance Methods Concrete Methods Modifier and Type Method Description voidadd(T instance, V value)Atomically replace the array with a new array which is one element longer, and which includes the given value.voidadd(T instance, V value, java.util.Comparator<? super V> comparator)Add a value to a sorted array.booleanaddIfAbsent(T instance, V value, boolean identity)Atomically replace the array with a new array which is one element longer, and which includes the given value, if the value is not already present within the array.booleanaddIfAbsent(T instance, V value, java.util.Comparator<? super V> comparator)Add a value to a sorted array if it is not already present.voidclear(T instance)Convenience method to set the field value to the empty array.booleancompareAndSet(T instance, V[] expect, V[] update)Compare and set the array.private static <V> V[]copyOf(java.lang.Class<V> componentType, V[] old, int newLen)static <T,V>
AtomicArray<T,V>create(java.util.concurrent.atomic.AtomicReferenceFieldUpdater<T,V[]> updater, java.lang.Class<V> componentType)Convenience method to create an instance.V[]getAndSet(T instance, V[] value)Atomically get and update the value of this array.private static intinsertionPoint(int searchResult)private static <V> V[]newInstance(java.lang.Class<V> componentType, int length)booleanremove(T instance, V value, boolean identity)Atomically replace the array with a new array which does not include the first occurrance of the given value, if the value is present in the array.booleanremove(T instance, V value, java.util.Comparator<? super V> comparator)Remove a value to a sorted array.intremoveAll(T instance, V value, boolean identity)Atomically replace the array with a new array which does not include any occurrances of the given value, if the value is present in the array.voidset(T instance, V[] value)Update the value of this array.voidsort(T instance, java.util.Comparator<? super V> comparator)Sort an array.
-
-
-
Method Detail
-
create
public static <T,V> AtomicArray<T,V> create(java.util.concurrent.atomic.AtomicReferenceFieldUpdater<T,V[]> updater, java.lang.Class<V> componentType)
Convenience method to create an instance.- Type Parameters:
T- the type which contains the target fieldV- the array value type- Parameters:
updater- the field updatercomponentType- the component class- Returns:
- the new instance
-
clear
public void clear(T instance)
Convenience method to set the field value to the empty array. Empty array instances are shared.- Parameters:
instance- the instance holding the field
-
set
public void set(T instance, V[] value)
Update the value of this array.- Parameters:
instance- the instance holding the fieldvalue- the new value
-
getAndSet
public V[] getAndSet(T instance, V[] value)
Atomically get and update the value of this array.- Parameters:
instance- the instance holding the fieldvalue- the new value
-
copyOf
private static <V> V[] copyOf(java.lang.Class<V> componentType, V[] old, int newLen)
-
add
public void add(T instance, V value)
Atomically replace the array with a new array which is one element longer, and which includes the given value.- Parameters:
instance- the instance holding the fieldvalue- the updated value
-
addIfAbsent
public boolean addIfAbsent(T instance, V value, boolean identity)
Atomically replace the array with a new array which is one element longer, and which includes the given value, if the value is not already present within the array. This method does a linear search for the target value.- Parameters:
instance- the instance holding the fieldvalue- the updated valueidentity-trueif comparisons should be done using reference identity, orfalseto use theequals()method- Returns:
trueif the value was added, orfalseif it was already present
-
remove
public boolean remove(T instance, V value, boolean identity)
Atomically replace the array with a new array which does not include the first occurrance of the given value, if the value is present in the array.- Parameters:
instance- the instance holding the fieldvalue- the updated valueidentity-trueif comparisons should be done using reference identity, orfalseto use theequals()method- Returns:
trueif the value was removed, orfalseif it was not present
-
removeAll
public int removeAll(T instance, V value, boolean identity)
Atomically replace the array with a new array which does not include any occurrances of the given value, if the value is present in the array.- Parameters:
instance- the instance holding the fieldvalue- the updated valueidentity-trueif comparisons should be done using reference identity, orfalseto use theequals()method- Returns:
- the number of values removed
-
add
public void add(T instance, V value, java.util.Comparator<? super V> comparator)
Add a value to a sorted array. Does not check for duplicates.- Parameters:
instance- the instance holding the fieldvalue- the value to addcomparator- a comparator, ornullto use natural ordering
-
addIfAbsent
public boolean addIfAbsent(T instance, V value, java.util.Comparator<? super V> comparator)
Add a value to a sorted array if it is not already present. Does not check for duplicates.- Parameters:
instance- the instance holding the fieldvalue- the value to addcomparator- a comparator, ornullto use natural ordering
-
remove
public boolean remove(T instance, V value, java.util.Comparator<? super V> comparator)
Remove a value to a sorted array. Does not check for duplicates. If there are multiple occurrances of a value, there is no guarantee as to which one is removed.- Parameters:
instance- the instance holding the fieldvalue- the value to removecomparator- a comparator, ornullto use natural ordering
-
sort
public void sort(T instance, java.util.Comparator<? super V> comparator)
Sort an array.- Parameters:
instance- the instance holding the fieldcomparator- a comparator, ornullto use natural ordering
-
insertionPoint
private static int insertionPoint(int searchResult)
-
newInstance
private static <V> V[] newInstance(java.lang.Class<V> componentType, int length)
-
-