Java的JUC的原子操做类能够分为四类:html
一、基本类型:AtomicInteger、AtomicLong、AtomicBooleanjava
二、数组类型:AtomicIntegerArray、AtomicLongArray、AtomicReferenceArray数组
三、引用类型:AtomicReference、AtomicStampedReference、AtomicMarkableReferenceapp
四、对象的属性修改类型:AtomicIntegerFiledUpdater、AtomicLongFieldUpdater、AtomicReferenceFieldUpdaterless
这些原子类的目的是对相应的数据进行原子操做。所谓原子操做就是操做过程不会被打断,保证数据操做是按照原子类型进行的。ide
AtomicInteger、AtomicLong、AtomicBoolean这几个基本类型的原子类的用法和原理类似。说说AtomicLong,其做用是对长整形进行原子操做。函数
/** * * @since 1.5 * @author Doug Lea */ public class AtomicLong extends Number implements java.io.Serializable { private static final long serialVersionUID = 1927816293512124184L; // setup to use Unsafe.compareAndSwapLong for updates private static final Unsafe unsafe = Unsafe.getUnsafe(); private static final long valueOffset; /** * Records whether the underlying JVM supports lockless * compareAndSwap for longs. While the Unsafe.compareAndSwapLong * method works in either case, some constructions should be * handled at Java level to avoid locking user-visible locks. */ static final boolean VM_SUPPORTS_LONG_CAS = VMSupportsCS8(); /** * Returns whether underlying JVM supports lockless CompareAndSet * for longs. Called only once and cached in VM_SUPPORTS_LONG_CAS. */ private static native boolean VMSupportsCS8(); static { try { valueOffset = unsafe.objectFieldOffset (AtomicLong.class.getDeclaredField("value")); } catch (Exception ex) { throw new Error(ex); } } private volatile long value; /** * 建立值为initialValue的AtomicLong对象 */ public AtomicLong(long initialValue) { value = initialValue; } /** * 构造函数 */ public AtomicLong() { } /** * 获取但前置值 */ public final long get() { return value; } /** * 以原子方式设置当前值为newValue */ public final void set(long newValue) { value = newValue; } /** * 延时设置变量值,和set差很少,只是有延迟 */ public final void lazySet(long newValue) { unsafe.putOrderedLong(this, valueOffset, newValue); } /** * 以原子方式将当前值设置为newValue,并返回旧值 */ public final long getAndSet(long newValue) { return unsafe.getAndSetLong(this, valueOffset, newValue); } /** * 若是当前值==预期值,则以原子的方式将该设置为给定的更新值 */ public final boolean compareAndSet(long expect, long update) { return unsafe.compareAndSwapLong(this, valueOffset, expect, update); } /** * 和上面效果差很少,只是不保证更新成功 */ public final boolean weakCompareAndSet(long expect, long update) { return unsafe.compareAndSwapLong(this, valueOffset, expect, update); } /** * 以原子的方式加1,并返回加1前的值 */ public final long getAndIncrement() { return unsafe.getAndAddLong(this, valueOffset, 1L); } /** * 以原子方式将当前值减1,并返回减1前的值 */ public final long getAndDecrement() { return unsafe.getAndAddLong(this, valueOffset, -1L); } /** * 按原子方式将当前值与delta相加,并返回相加前的值 */ public final long getAndAdd(long delta) { return unsafe.getAndAddLong(this, valueOffset, delta); } /** * 以原子方式将当前值加1,并返回加1后的值 */ public final long incrementAndGet() { return unsafe.getAndAddLong(this, valueOffset, 1L) + 1L; } /** * 按原子方式减1,并返回减1后的值 */ public final long decrementAndGet() { return unsafe.getAndAddLong(this, valueOffset, -1L) - 1L; } /** * 按原子方式将当前值与delta相加,并返回相加后的值 */ public final long addAndGet(long delta) { return unsafe.getAndAddLong(this, valueOffset, delta) + delta; } /** * Atomically updates the current value with the results of * applying the given function, returning the previous value. The * function should be side-effect-free, since it may be re-applied * when attempted updates fail due to contention among threads. * * @param updateFunction a side-effect-free function * @return the previous value * @since 1.8 */ public final long getAndUpdate(LongUnaryOperator updateFunction) { long prev, next; do { prev = get(); next = updateFunction.applyAsLong(prev); } while (!compareAndSet(prev, next)); return prev; } /** * Atomically updates the current value with the results of * applying the given function, returning the updated value. The * function should be side-effect-free, since it may be re-applied * when attempted updates fail due to contention among threads. * * @param updateFunction a side-effect-free function * @return the updated value * @since 1.8 */ public final long updateAndGet(LongUnaryOperator updateFunction) { long prev, next; do { prev = get(); next = updateFunction.applyAsLong(prev); } while (!compareAndSet(prev, next)); return next; } /** * Atomically updates the current value with the results of * applying the given function to the current and given values, * returning the previous value. The function should be * side-effect-free, since it may be re-applied when attempted * updates fail due to contention among threads. The function * is applied with the current value as its first argument, * and the given update as the second argument. * * @param x the update value * @param accumulatorFunction a side-effect-free function of two arguments * @return the previous value * @since 1.8 */ public final long getAndAccumulate(long x, LongBinaryOperator accumulatorFunction) { long prev, next; do { prev = get(); next = accumulatorFunction.applyAsLong(prev, x); } while (!compareAndSet(prev, next)); return prev; } /** * Atomically updates the current value with the results of * applying the given function to the current and given values, * returning the updated value. The function should be * side-effect-free, since it may be re-applied when attempted * updates fail due to contention among threads. The function * is applied with the current value as its first argument, * and the given update as the second argument. * * @param x the update value * @param accumulatorFunction a side-effect-free function of two arguments * @return the updated value * @since 1.8 */ public final long accumulateAndGet(long x, LongBinaryOperator accumulatorFunction) { long prev, next; do { prev = get(); next = accumulatorFunction.applyAsLong(prev, x); } while (!compareAndSet(prev, next)); return next; } /** * 将当前值转换为string类型并返回 */ public String toString() { return Long.toString(get()); } /** * 返回当前对应的int */ public int intValue() { return (int)get(); } /** * 获取当前值对应的long值 */ public long longValue() { return get(); } /** * 以floa形式返回当前值 */ public float floatValue() { return (float)get(); } /** * 以double的形式返回当前值 */ public double doubleValue() { return (double)get(); } }
AtomicIntegerArray、AtomicLongArray、AtomicReferenceArray三个原理和用法类似,说说AtomicIntegerArrayui
public class AtomicLongArray implements java.io.Serializable { private static final long serialVersionUID = -2308431214976778248L; private static final Unsafe unsafe = Unsafe.getUnsafe(); private static final int base = unsafe.arrayBaseOffset(long[].class); private static final int shift; private final long[] array; static { int scale = unsafe.arrayIndexScale(long[].class); if ((scale & (scale - 1)) != 0) throw new Error("data type scale not a power of two"); shift = 31 - Integer.numberOfLeadingZeros(scale); } private long checkedByteOffset(int i) { if (i < 0 || i >= array.length) throw new IndexOutOfBoundsException("index " + i); return byteOffset(i); } private static long byteOffset(int i) { return ((long) i << shift) + base; } /** * 建立给定长度的AtomicLongArray */ public AtomicLongArray(int length) { array = new long[length]; } /** * 建立与给定数组长度相同的AtomicLongArray,并从给定数组赋值全部元素 */ public AtomicLongArray(long[] array) { // Visibility guaranteed by final field guarantees this.array = array.clone(); } /** * 返回数组长度 */ public final int length() { return array.length; } /** * 获取位置i的值 */ public final long get(int i) { return getRaw(checkedByteOffset(i)); } private long getRaw(long offset) { return unsafe.getLongVolatile(array, offset); } /** * 设置指定位置i的值newValue */ public final void set(int i, long newValue) { unsafe.putLongVolatile(array, checkedByteOffset(i), newValue); } /** * 延迟设置指定位置的值 */ public final void lazySet(int i, long newValue) { unsafe.putOrderedLong(array, checkedByteOffset(i), newValue); } /** * 将指定位置i的值设置为newValue,并返回原来的值 */ public final long getAndSet(int i, long newValue) { return unsafe.getAndSetLong(array, checkedByteOffset(i), newValue); } /** * 若是当前值与预期的值相同,则以原子的方式将该值设置为给定的更新值 */ public final boolean compareAndSet(int i, long expect, long update) { return compareAndSetRaw(checkedByteOffset(i), expect, update); } private boolean compareAndSetRaw(long offset, long expect, long update) { return unsafe.compareAndSwapLong(array, offset, expect, update); } /** * */ public final boolean weakCompareAndSet(int i, long expect, long update) { return compareAndSet(i, expect, update); } /** * 以原子的方式将索引出的值加1 */ public final long getAndIncrement(int i) { return getAndAdd(i, 1); } /** * 按原子的方式将索引处的元素加1 */ public final long getAndDecrement(int i) { return getAndAdd(i, -1); } /** * 以原子方式将索引出的值与delta相加 */ public final long getAndAdd(int i, long delta) { return unsafe.getAndAddLong(array, checkedByteOffset(i), delta); } /** * 加1 */ public final long incrementAndGet(int i) { return getAndAdd(i, 1) + 1; } /** * 减1 */ public final long decrementAndGet(int i) { return getAndAdd(i, -1) - 1; } /** * 加delta */ public long addAndGet(int i, long delta) { return getAndAdd(i, delta) + delta; } /** * Atomically updates the element at index {@code i} with the results * of applying the given function, returning the previous value. The * function should be side-effect-free, since it may be re-applied * when attempted updates fail due to contention among threads. * * @param i the index * @param updateFunction a side-effect-free function * @return the previous value * @since 1.8 */ public final long getAndUpdate(int i, LongUnaryOperator updateFunction) { long offset = checkedByteOffset(i); long prev, next; do { prev = getRaw(offset); next = updateFunction.applyAsLong(prev); } while (!compareAndSetRaw(offset, prev, next)); return prev; } /** * Atomically updates the element at index {@code i} with the results * of applying the given function, returning the updated value. The * function should be side-effect-free, since it may be re-applied * when attempted updates fail due to contention among threads. * * @param i the index * @param updateFunction a side-effect-free function * @return the updated value * @since 1.8 */ public final long updateAndGet(int i, LongUnaryOperator updateFunction) { long offset = checkedByteOffset(i); long prev, next; do { prev = getRaw(offset); next = updateFunction.applyAsLong(prev); } while (!compareAndSetRaw(offset, prev, next)); return next; } /** * Atomically updates the element at index {@code i} with the * results of applying the given function to the current and * given values, returning the previous value. The function should * be side-effect-free, since it may be re-applied when attempted * updates fail due to contention among threads. The function is * applied with the current value at index {@code i} as its first * argument, and the given update as the second argument. *更新索引处的值,并返回索引处前一个值 * @param i the index * @param x the update value * @param accumulatorFunction a side-effect-free function of two arguments * @return the previous value * @since 1.8 */ public final long getAndAccumulate(int i, long x, LongBinaryOperator accumulatorFunction) { long offset = checkedByteOffset(i); long prev, next; do { prev = getRaw(offset); next = accumulatorFunction.applyAsLong(prev, x); } while (!compareAndSetRaw(offset, prev, next)); return prev; } /** * Atomically updates the element at index {@code i} with the * results of applying the given function to the current and * given values, returning the updated value. The function should * be side-effect-free, since it may be re-applied when attempted * updates fail due to contention among threads. The function is * applied with the current value at index {@code i} as its first * argument, and the given update as the second argument. * * @param i the index * @param x the update value * @param accumulatorFunction a side-effect-free function of two arguments * @return the updated value * @since 1.8 */ public final long accumulateAndGet(int i, long x, LongBinaryOperator accumulatorFunction) { long offset = checkedByteOffset(i); long prev, next; do { prev = getRaw(offset); next = accumulatorFunction.applyAsLong(prev, x); } while (!compareAndSetRaw(offset, prev, next)); return next; } /** *将当前的数组以string形式返回 */ public String toString() { int iMax = array.length - 1; if (iMax == -1) return "[]"; StringBuilder b = new StringBuilder(); b.append('['); for (int i = 0; ; i++) { b.append(getRaw(byteOffset(i))); if (i == iMax) return b.append(']').toString(); b.append(',').append(' '); } } }
public class AtomicReference<V> implements java.io.Serializable { private static final long serialVersionUID = -1848883965231344442L; //获取Unsafe对象,Unsafe得做用是提供CAS操做 private static final Unsafe unsafe = Unsafe.getUnsafe(); private static final long valueOffset; static { try { valueOffset = unsafe.objectFieldOffset (AtomicReference.class.getDeclaredField("value")); } catch (Exception ex) { throw new Error(ex); } } private volatile V value; /** * 用给定值建立AtomicReference */ public AtomicReference(V initialValue) { value = initialValue; } /** * 直接建立一个AtomicReference */ public AtomicReference() { } /** * 获取当前值 */ public final V get() { return value; } /** *设置为给定值 */ public final void set(V newValue) { value = newValue; } /** * 延迟设置 */ public final void lazySet(V newValue) { unsafe.putOrderedObject(this, valueOffset, newValue); } /** * 当前值==预期值,以原子的方式将该值设置为给定值的更新 */ public final boolean compareAndSet(V expect, V update) { return unsafe.compareAndSwapObject(this, valueOffset, expect, update); } public final boolean weakCompareAndSet(V expect, V update) { return unsafe.compareAndSwapObject(this, valueOffset, expect, update); } /** * 设置为给定值,并返回以前的值 */ @SuppressWarnings("unchecked") public final V getAndSet(V newValue) { return (V)unsafe.getAndSetObject(this, valueOffset, newValue); } /** * Atomically updates the current value with the results of * applying the given function, returning the previous value. The * function should be side-effect-free, since it may be re-applied * when attempted updates fail due to contention among threads. *更新值,并返回当前值指向的前一个值 * @param updateFunction a side-effect-free function * @return the previous value * @since 1.8 */ public final V getAndUpdate(UnaryOperator<V> updateFunction) { V prev, next; do { prev = get(); next = updateFunction.apply(prev); } while (!compareAndSet(prev, next)); return prev; } /** * Atomically updates the current value with the results of * applying the given function, returning the updated value. The * function should be side-effect-free, since it may be re-applied * when attempted updates fail due to contention among threads. * * @param updateFunction a side-effect-free function * @return the updated value * @since 1.8 */ public final V updateAndGet(UnaryOperator<V> updateFunction) { V prev, next; do { prev = get(); next = updateFunction.apply(prev); } while (!compareAndSet(prev, next)); return next; } /** * Atomically updates the current value with the results of * applying the given function to the current and given values, * returning the previous value. The function should be * side-effect-free, since it may be re-applied when attempted * updates fail due to contention among threads. The function * is applied with the current value as its first argument, * and the given update as the second argument. * * @param x the update value * @param accumulatorFunction a side-effect-free function of two arguments * @return the previous value * @since 1.8 */ public final V getAndAccumulate(V x, BinaryOperator<V> accumulatorFunction) { V prev, next; do { prev = get(); next = accumulatorFunction.apply(prev, x); } while (!compareAndSet(prev, next)); return prev; } /** * Atomically updates the current value with the results of * applying the given function to the current and given values, * returning the updated value. The function should be * side-effect-free, since it may be re-applied when attempted * updates fail due to contention among threads. The function * is applied with the current value as its first argument, * and the given update as the second argument. * * @param x the update value * @param accumulatorFunction a side-effect-free function of two arguments * @return the updated value * @since 1.8 */ public final V accumulateAndGet(V x, BinaryOperator<V> accumulatorFunction) { V prev, next; do { prev = get(); next = accumulatorFunction.apply(prev, x); } while (!compareAndSet(prev, next)); return next; } /** * 返回string类型的值 */ public String toString() { return String.valueOf(get()); } }
public abstract class AtomicIntegerFieldUpdater<T> { @CallerSensitive public static <U> AtomicIntegerFieldUpdater<U> newUpdater(Class<U> tclass, String fieldName) { return new AtomicIntegerFieldUpdaterImpl<U> (tclass, fieldName, Reflection.getCallerClass()); } /** * 受保护的无操做构造方法,供子类使用 */ protected AtomicIntegerFieldUpdater() { } /** * 若是当前值==预期值,则以原子的方式将此更新器所管理的给定对象的字段设置为给定的更新值 */ public abstract boolean compareAndSet(T obj, int expect, int update); public abstract boolean weakCompareAndSet(T obj, int expect, int update); /** * 将此更新器管理的给定对象的字段设置为给定更新值 */ public abstract void set(T obj, int newValue); /** *最后将此更新管理器给定对象的字段设置为给定更新值 */ public abstract void lazySet(T obj, int newValue); /** * 获取此更新管理器管理的给定对象的字段中保持的当前值 */ public abstract int get(T obj); /** * 将此更新管理器的给定对象的字段以原子方式设定为给定值,并返回旧值 */ public int getAndSet(T obj, int newValue) { int prev; do { prev = get(obj); } while (!compareAndSet(obj, prev, newValue)); return prev; } /** * 以原子方式将此更新管理的给定对象字段的当前值加1 */ public int getAndIncrement(T obj) { int prev, next; do { prev = get(obj); next = prev + 1; } while (!compareAndSet(obj, prev, next)); return prev; } /** * 以原子方式将此更新管理器给定对象字段的当前值减1 */ public int getAndDecrement(T obj) { int prev, next; do { prev = get(obj); next = prev - 1; } while (!compareAndSet(obj, prev, next)); return prev; } /** * 以原子方式将给定值添加到此更新管理器给定字段的当前值 */ public int getAndAdd(T obj, int delta) { int prev, next; do { prev = get(obj); next = prev + delta; } while (!compareAndSet(obj, prev, next)); return prev; } /** * 以原子方式将此更新管理器的给定对象字段当前值加1 */ public int incrementAndGet(T obj) { int prev, next; do { prev = get(obj); next = prev + 1; } while (!compareAndSet(obj, prev, next)); return next; } /** * 以原子方式将此更新管理器的给定对象字段当前值减1 */ public int decrementAndGet(T obj) { int prev, next; do { prev = get(obj); next = prev - 1; } while (!compareAndSet(obj, prev, next)); return next; } /** * Atomically adds the given value to the current value of the field of * the given object managed by this updater. * * @param obj An object whose field to get and set * @param delta the value to add * @return the updated value */ public int addAndGet(T obj, int delta) { int prev, next; do { prev = get(obj); next = prev + delta; } while (!compareAndSet(obj, prev, next)); return next; } /** * Atomically updates the field of the given object managed by this updater * with the results of applying the given function, returning the previous * value. The function should be side-effect-free, since it may be * re-applied when attempted updates fail due to contention among threads. * * @param obj An object whose field to get and set * @param updateFunction a side-effect-free function * @return the previous value * @since 1.8 */ public final int getAndUpdate(T obj, IntUnaryOperator updateFunction) { int prev, next; do { prev = get(obj); next = updateFunction.applyAsInt(prev); } while (!compareAndSet(obj, prev, next)); return prev; } /** * Atomically updates the field of the given object managed by this updater * with the results of applying the given function, returning the updated * value. The function should be side-effect-free, since it may be * re-applied when attempted updates fail due to contention among threads. * */ public final int updateAndGet(T obj, IntUnaryOperator updateFunction) { int prev, next; do { prev = get(obj); next = updateFunction.applyAsInt(prev); } while (!compareAndSet(obj, prev, next)); return next; } /** * Atomically updates the field of the given object managed by this * updater with the results of applying the given function to the * current and given values, returning the previous value. The * function should be side-effect-free, since it may be re-applied * when attempted updates fail due to contention among threads. The * function is applied with the current value as its first argument, * and the given update as the second argument. */ public final int getAndAccumulate(T obj, int x, IntBinaryOperator accumulatorFunction) { int prev, next; do { prev = get(obj); next = accumulatorFunction.applyAsInt(prev, x); } while (!compareAndSet(obj, prev, next)); return prev; } /** * Atomically updates the field of the given object managed by this * updater with the results of applying the given function to the * current and given values, returning the updated value. The * function should be side-effect-free, since it may be re-applied * when attempted updates fail due to contention among threads. The * function is applied with the current value as its first argument, * and the given update as the second argument. */ public final int accumulateAndGet(T obj, int x, IntBinaryOperator accumulatorFunction) { int prev, next; do { prev = get(obj); next = accumulatorFunction.applyAsInt(prev, x); } while (!compareAndSet(obj, prev, next)); return next; } /** * Standard hotspot implementation using intrinsics */ private static class AtomicIntegerFieldUpdaterImpl<T> extends AtomicIntegerFieldUpdater<T> { private static final Unsafe unsafe = Unsafe.getUnsafe(); private final long offset; private final Class<T> tclass; private final Class<?> cclass; AtomicIntegerFieldUpdaterImpl(final Class<T> tclass, final String fieldName, final Class<?> caller) { final Field field; final int modifiers; try { field = AccessController.doPrivileged( new PrivilegedExceptionAction<Field>() { public Field run() throws NoSuchFieldException { return tclass.getDeclaredField(fieldName); } }); modifiers = field.getModifiers(); sun.reflect.misc.ReflectUtil.ensureMemberAccess( caller, tclass, null, modifiers); ClassLoader cl = tclass.getClassLoader(); ClassLoader ccl = caller.getClassLoader(); if ((ccl != null) && (ccl != cl) && ((cl == null) || !isAncestor(cl, ccl))) { sun.reflect.misc.ReflectUtil.checkPackageAccess(tclass); } } catch (PrivilegedActionException pae) { throw new RuntimeException(pae.getException()); } catch (Exception ex) { throw new RuntimeException(ex); } Class<?> fieldt = field.getType(); if (fieldt != int.class) throw new IllegalArgumentException("Must be integer type"); if (!Modifier.isVolatile(modifiers)) throw new IllegalArgumentException("Must be volatile type"); this.cclass = (Modifier.isProtected(modifiers) && caller != tclass) ? caller : null; this.tclass = tclass; offset = unsafe.objectFieldOffset(field); } /** * Returns true if the second classloader can be found in the first * classloader's delegation chain. * Equivalent to the inaccessible: first.isAncestor(second). */ private static boolean isAncestor(ClassLoader first, ClassLoader second) { ClassLoader acl = first; do { acl = acl.getParent(); if (second == acl) { return true; } } while (acl != null); return false; } }
经过“volatile”和“Unsafe提供得CSA函数实现”原子操做。this
1)value是volatile类型,这保证了:当某线程修改value得值时,其余线程看到的value值都是最新的value值,即修改以后的value值spa
2)经过CAS设置value,这保证了:当某线程经过CAS函数设置value值得时候,它得操做是原子的,即线程在操做value时不会被中断。