/** * A {@code boolean} value that may be updated atomically. See the * {@link java.util.concurrent.atomic} package specification for * description of the properties of atomic variables. An * {@code AtomicBoolean} is used in applications such as atomically * updated flags, and cannot be used as a replacement for a * {@link java.lang.Boolean}. * * @since 1.5 * @author Doug Lea */ publicclassAtomicBooleanimplementsjava.io.Serializable { privatestaticfinallongserialVersionUID=4654671469794556979L; // setup to use Unsafe.compareAndSwapInt for updates privatestaticfinalUnsafeunsafe= Unsafe.getUnsafe(); privatestaticfinallong valueOffset;
/** * Creates a new {@code AtomicBoolean} with the given initial value. * * @param initialValue the initial value */ publicAtomicBoolean(boolean initialValue) { value = initialValue ? 1 : 0; }
/** * Creates a new {@code AtomicBoolean} with initial value {@code false}. */ publicAtomicBoolean() { }
/** * Returns the current value. * * @return the current value */ publicfinalbooleanget() { return value != 0; }
/** * Atomically sets the value to the given updated value * if the current value {@code ==} the expected value. * * @param expect the expected value * @param update the new value * @return {@code true} if successful. False return indicates that * the actual value was not equal to the expected value. */ publicfinalbooleancompareAndSet(boolean expect, boolean update) { inte= expect ? 1 : 0; intu= update ? 1 : 0; return unsafe.compareAndSwapInt(this, valueOffset, e, u); }
/** * Atomically sets the value to the given updated value * if the current value {@code ==} the expected value. * * <p><a href="package-summary.html#weakCompareAndSet">May fail * spuriously and does not provide ordering guarantees</a>, so is * only rarely an appropriate alternative to {@code compareAndSet}. * * @param expect the expected value * @param update the new value * @return {@code true} if successful */ publicbooleanweakCompareAndSet(boolean expect, boolean update) { inte= expect ? 1 : 0; intu= update ? 1 : 0; return unsafe.compareAndSwapInt(this, valueOffset, e, u); }
/** * Unconditionally sets to the given value. * * @param newValue the new value */ publicfinalvoidset(boolean newValue) { value = newValue ? 1 : 0; }
/** * Eventually sets to the given value. * * @param newValue the new value * @since 1.6 */ publicfinalvoidlazySet(boolean newValue) { intv= newValue ? 1 : 0; unsafe.putOrderedInt(this, valueOffset, v); }
/** * Atomically sets to the given value and returns the previous value. * * @param newValue the new value * @return the previous value */ publicfinalbooleangetAndSet(boolean newValue) { boolean prev; do { prev = get(); } while (!compareAndSet(prev, newValue)); return prev; }
/** * Returns the String representation of the current value. * @return the String representation of the current value */ public String toString() { return Boolean.toString(get()); }