CAS compare and swap
线程切换线程8w个时钟周期。对于竞争不激烈的情况,使用循环使用CAS开销更小。
无锁操作在并发比较少的情况下效率高,但不要迷恋无锁。
CAS是CPU指令级别的原子操作,一条指令完成比较赋值过程,不用担心并发问题。
AtomicInteger
AtomicInteger 部分源码
1 | // setup to use Unsafe.compareAndSwapInt for updates |
Unsafe 部分源码
1 | //valueOffset 代表需要更新的字段在对象中的偏移量,类似于c中的指针,获取需要更新字段的内存地址 |
AtomicReference
可以修饰任意类型的变量,是的变量操作变为院子操作
AtomicReference
AtomicStampedReference
与AtomicReference功能相似,不同点是AtomicStampedReference可以解决过程相关的情景。过程敏感的情景试用。
假设一个活动只能给每个用户充值一次10元钱,用户可以消费。假设用户A充值以后立马消费10元,AtomicReference还会认为只消费了一次。
1 | AtomicStampedReference<Integer> money = new AtomicStampedReference<>(0,0); |
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 |