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并发 -- 原子类」获取最佳阅读体验并参与讨论