AtomicMarkableReferencepublic class AtomicMarkableReference extends Object An {@code AtomicMarkableReference} maintains an object reference
along with a mark bit, that can be updated atomically.
Implementation note. This implementation maintains markable
references by creating internal objects representing "boxed"
[reference, boolean] pairs. |
Fields Summary |
---|
private final AtomicReference | atomicRef |
Constructors Summary |
---|
public AtomicMarkableReference(V initialRef, boolean initialMark)Creates a new {@code AtomicMarkableReference} with the given
initial values.
atomicRef = new AtomicReference<ReferenceBooleanPair<V>> (new ReferenceBooleanPair<V>(initialRef, initialMark));
|
Methods Summary |
---|
public boolean | attemptMark(V expectedReference, boolean newMark)Atomically sets the value of the mark to the given update value
if the current reference is {@code ==} to the expected
reference. Any given invocation of this operation may fail
(return {@code false}) spuriously, but repeated invocation
when the current value holds the expected value and no other
thread is also attempting to set the value will eventually
succeed.
ReferenceBooleanPair<V> current = atomicRef.get();
return expectedReference == current.reference &&
(newMark == current.bit ||
atomicRef.compareAndSet
(current, new ReferenceBooleanPair<V>(expectedReference,
newMark)));
| public boolean | compareAndSet(V expectedReference, V newReference, boolean expectedMark, boolean newMark)Atomically sets the value of both the reference and mark
to the given update values if the
current reference is {@code ==} to the expected reference
and the current mark is equal to the expected mark.
ReferenceBooleanPair<V> current = atomicRef.get();
return expectedReference == current.reference &&
expectedMark == current.bit &&
((newReference == current.reference && newMark == current.bit) ||
atomicRef.compareAndSet(current,
new ReferenceBooleanPair<V>(newReference,
newMark)));
| public V | get(boolean[] markHolder)Returns the current values of both the reference and the mark.
Typical usage is {@code boolean[1] holder; ref = v.get(holder); }.
ReferenceBooleanPair<V> p = atomicRef.get();
markHolder[0] = p.bit;
return p.reference;
| public V | getReference()Returns the current value of the reference.
return atomicRef.get().reference;
| public boolean | isMarked()Returns the current value of the mark.
return atomicRef.get().bit;
| public void | set(V newReference, boolean newMark)Unconditionally sets the value of both the reference and mark.
ReferenceBooleanPair<V> current = atomicRef.get();
if (newReference != current.reference || newMark != current.bit)
atomicRef.set(new ReferenceBooleanPair<V>(newReference, newMark));
| public boolean | weakCompareAndSet(V expectedReference, V newReference, boolean expectedMark, boolean newMark)Atomically sets the value of both the reference and mark
to the given update values if the
current reference is {@code ==} to the expected reference
and the current mark is equal to the expected mark.
May fail spuriously
and does not provide ordering guarantees, so is only rarely an
appropriate alternative to {@code compareAndSet}.
ReferenceBooleanPair<V> current = atomicRef.get();
return expectedReference == current.reference &&
expectedMark == current.bit &&
((newReference == current.reference && newMark == current.bit) ||
atomicRef.weakCompareAndSet(current,
new ReferenceBooleanPair<V>(newReference,
newMark)));
|
|