在上一篇博客 并发编程--原子类AotmicInteger中我们已经简单介绍了一下AtomicInteger相关的知识,简单来说AtomicLong的实现原理与AtomicInteger是相同的,用volatile来修饰变量value和使用sun.misc.Unsafe来完成对value的原子操作。
AtomicBoolean的实现机制还是比较简单的,通过判断用volatile修改的value与1和0之间的关系来返回true和false,使用sun.misc.Unsafe来完成对value的原子操作
AtomicReference的实现机制就是通过sun.misc.Unsafe来对对象引用进行原子操作。
源码如下:
- public class AtomicLong extends Number implements java.io.Serializable {
- private static final long serialVersionUID = 1927816293512124184L;
- private static final Unsafe unsafe = Unsafe.getUnsafe();
- private static final long valueOffset;
- static final boolean VM_SUPPORTS_LONG_CAS = VMSupportsCS8();
- 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;
- public AtomicLong(long initialValue) {
- value = initialValue;
- }
- public AtomicLong() {
- }
- public final long get() {
- return value;
- }
- public final void set(long newValue) {
- value = newValue;
- }
- public final void lazySet(long newValue) {
- unsafe.putOrderedLong(this, valueOffset, 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);
- }
- public final long getAndIncrement() {
- return unsafe.getAndAddLong(this, valueOffset, 1L);
- }
- public final long getAndDecrement() {
- return unsafe.getAndAddLong(this, valueOffset, -1L);
- }
- public final long getAndAdd(long delta) {
- return unsafe.getAndAddLong(this, valueOffset, delta);
- }
- public final long incrementAndGet() {
- return unsafe.getAndAddLong(this, valueOffset, 1L) + 1L;
- }
- public final long decrementAndGet() {
- return unsafe.getAndAddLong(this, valueOffset, -1L) - 1L;
- }
- public final long addAndGet(long delta) {
- return unsafe.getAndAddLong(this, valueOffset, delta) + delta;
- }
- public final long getAndUpdate(LongUnaryOperator updateFunction) {
- long prev, next;
- do {
- prev = get();
- next = updateFunction.applyAsLong(prev);
- } while (!compareAndSet(prev, next));
- return prev;
- }
- public final long updateAndGet(LongUnaryOperator updateFunction) {
- long prev, next;
- do {
- prev = get();
- next = updateFunction.applyAsLong(prev);
- } while (!compareAndSet(prev, next));
- return next;
- }
- 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;
- }
- 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;
- }
- public String toString() {
- return Long.toString(get());
- }
- public int intValue() {
- return (int)get();
- }
- public long longValue() {
- return get();
- }
- public float floatValue() {
- return (float)get();
- }
- public double doubleValue() {
- return (double)get();
- }
- }
AtomicBoolean的源码:
- public class AtomicBoolean implements java.io.Serializable {
- private static final long serialVersionUID = 4654671469794556979L;
- private static final Unsafe unsafe = Unsafe.getUnsafe();
- private static final long valueOffset;
- static {
- try {
- valueOffset = unsafe.objectFieldOffset
- (AtomicBoolean.class.getDeclaredField("value"));
- } catch (Exception ex) { throw new Error(ex); }
- }
- private volatile int value;
- public AtomicBoolean(boolean initialValue) {
- value = initialValue ? 1 : 0;
- }
- public AtomicBoolean() {
- }
- public final boolean get() {
- return value != 0;
- }
- public final boolean compareAndSet(boolean expect, boolean update) {
- int e = expect ? 1 : 0;
- int u = update ? 1 : 0;
- return unsafe.compareAndSwapInt(this, valueOffset, e, u);
- }
- public boolean weakCompareAndSet(boolean expect, boolean update) {
- int e = expect ? 1 : 0;
- int u = update ? 1 : 0;
- return unsafe.compareAndSwapInt(this, valueOffset, e, u);
- }
- public final void set(boolean newValue) {
- value = newValue ? 1 : 0;
- }
- public final void lazySet(boolean newValue) {
- int v = newValue ? 1 : 0;
- unsafe.putOrderedInt(this, valueOffset, v);
- }
- public final boolean getAndSet(boolean newValue) {
- boolean prev;
- do {
- prev = get();
- } while (!compareAndSet(prev, newValue));
- return prev;
- }
- public String toString() {
- return Boolean.toString(get());
- }
- }
AtomicReference源码:
- public class AtomicReference<V> implements java.io.Serializable {
- private static final long serialVersionUID = -1848883965231344442L;
- 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;
- public AtomicReference(V initialValue) {
- value = initialValue;
- }
- 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);
- }
- public final V getAndUpdate(UnaryOperator<V> updateFunction) {
- V prev, next;
- do {
- prev = get();
- next = updateFunction.apply(prev);
- } while (!compareAndSet(prev, next));
- return prev;
- }
- public final V updateAndGet(UnaryOperator<V> updateFunction) {
- V prev, next;
- do {
- prev = get();
- next = updateFunction.apply(prev);
- } while (!compareAndSet(prev, next));
- return next;
- }
- 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;
- }
- 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;
- }
- public String toString() {
- return String.valueOf(get());
- }
- }