CAS compare and swap
线程切换线程8w个时钟周期。对于竞争不激烈的情况,使用循环使用CAS开销更小。
无锁操作在并发比较少的情况下效率高,但不要迷恋无锁。
CAS是CPU指令级别的原子操作,一条指令完成比较赋值过程,不用担心并发问题。
AtomicInteger
AtomicInteger 部分源码1
2
3
4
5
6
7
8
9
10
11// setup to use Unsafe.compareAndSwapInt for updates
//只有bootstrap加载器加载的类才能获取Unsafe的实例,其他类只能用反射获取
private static final Unsafe unsafe = Unsafe.getUnsafe();
//valueOffset 代表需要更新的字段在对象中的偏移量,类似于c中的指针,获取需要更新字段的内存地址
private static final long valueOffset;
public final boolean compareAndSet(int expect, int update) {
return unsafe.compareAndSwapInt(this, valueOffset, expect, update);
}
public final int getAndIncrement() {
return unsafe.getAndAddInt(this, valueOffset, 1);
}
Unsafe 部分源码
1 | //valueOffset 代表需要更新的字段在对象中的偏移量,类似于c中的指针,获取需要更新字段的内存地址 |
AtomicReference
可以修饰任意类型的变量,是的变量操作变为院子操作
AtomicReference
AtomicStampedReference
与AtomicReference功能相似,不同点是AtomicStampedReference可以解决过程相关的情景。过程敏感的情景试用。
假设一个活动只能给每个用户充值一次10元钱,用户可以消费。假设用户A充值以后立马消费10元,AtomicReference还会认为只消费了一次。
1
2
3AtomicStampedReference<Integer> money = new AtomicStampedReference<>(0,0);
int stamp = money.getStamp();
money.compareAndSet(0,10,stamp,stamp+1);
AtomicStampedReference部分源码
1 | private static class Pair<T> { |
AtomicIntegerArray
原子操作的整数数组
1 | AtomicIntegerArray array = new AtomicIntegerArray(10); |
1 | private static final Unsafe unsafe = Unsafe.getUnsafe(); |
AtomicIntegerFieldUpdater
AtomicIntegerFieldUpdater辅助一个类,用类似静态方法的方式,实现变量的原子操作。优点在于不必改变变量的类型,即可享受原子变量的好处。如果是已有代码修改,将会大大减少代码的修改量。
1 | public static class Candidate{ |
AtomicIntegerFieldUpdater部分源码
1 | public static <U> AtomicLongFieldUpdater<U> newUpdater(Class<U> tclass, |
LockFreeVector
无锁数组,amino框架提供
1 | //第一桶的大小为8 |