private long count = 0; public void add() { int idx = 0; while (idx++ < 10_000) { count += 1; } }
private AtomicLong atomicCount = new AtomicLong(0); public void atomicAdd() { int idx = 0; while (idx++ < 10_000) { atomicCount.getAndIncrement(); } }
public class SimulatedCAS { private volatile int count; public void addOne() { // 自旋 int newValue; do { newValue = count + 1; // 1 } while (count != cas(count, newValue)); // 2 } // 模拟实现CAS private synchronized int cas(int expect, int newValue) { // 读取当前count的值 int curValue = count; // 比较 当前count的值 是否等于 期望值 if (curValue == expect) { count = newValue; } // 返回旧值 return curValue; } }
// AtomicLong public final long getAndIncrement() { // this和valueOffset这两个参数可以唯一确定共享变量的内存地址 return unsafe.getAndAddLong(this, valueOffset, 1L); } // Unsafe public final long getAndAddLong(Object o, long offset, long delta) { long v; do { // 读取内存中的值 v = getLongVolatile(o, offset); } while (!compareAndSwapLong(o, offset, v, v + delta)); return v; } public native long getLongVolatile(Object o, long offset); // 原子性地将变量更新为x,条件是内存中的值等于expected,更新成功则返回true // compareAndSwapLong的语义和CAS指令的语义的差别,仅仅只是返回值不同而已 public final native boolean compareAndSwapLong(Object o, long offset, long expected, long x);
相关实现有AtomicBoolean、AtomicInteger和AtomicLong
getAndIncrement() // 原子化 i++ getAndDecrement() // 原子化的 i-- incrementAndGet() // 原子化的 ++i decrementAndGet() // 原子化的 --i // 当前值 +=delta,返回 += 前的值 getAndAdd(delta) // 当前值 +=delta,返回 += 后的值 addAndGet(delta) // CAS操作,返回是否成功 compareAndSet(expect, update) // 以下四个方法 // 新值可以通过传入func函数来计算 getAndUpdate(func) updateAndGet(func) getAndAccumulate(x,func) accumulateAndGet(x,func)
public boolean compareAndSet(V expectedReference, V newReference, int expectedStamp, int newStamp)
将版本号简化成一个 Boolean值
public boolean compareAndSet(V expectedReference, V newReference, boolean expectedMark, boolean newMark)
// AtomicLongFieldUpdater public static <U> AtomicLongFieldUpdater<U> newUpdater(Class<U> tclass, String fieldName); // AtomicLongFieldUpdater#CASUpdater public final boolean compareAndSet(T obj, long expect, long update) // AtomicLongFieldUpdater#LockedUpdater public final boolean compareAndSet(T obj, long expect, long update)
转载请注明出处:http://zhongmingmao.me/2019/05/13/java-concurrent-atomic/
访问原文「Java并发 -- 原子类」获取最佳阅读体验并参与讨论