java原子操作cas_CAS 思想与 java 原子操作的实现

下面,我们通过 AtomicInteger 的源码来介绍一下 Unsafe 类的使用:

public class AtomicInteger extends Number implements java.io.Serializable {

private static final long serialVersionUID = 6214790243416807050L;

// 获取指针类Unsafe

private static final Unsafe unsafe = Unsafe.getUnsafe();

//下述变量value在AtomicInteger实例对象内的内存偏移量

private static final long valueOffset;

static {

try {

//通过unsafe类的objectFieldOffset()方法,获取value变量在对象内存中的偏移

//通过该偏移量valueOffset,unsafe类的内部方法可以获取到变量value对其进行取值或赋值操作

valueOffset = unsafe.objectFieldOffset

(AtomicInteger.class.getDeclaredField("value"));

} catch (Exception ex) { throw new Error(ex); }

}

//当前AtomicInteger封装的int变量value

private volatile int value;

public AtomicInteger(int initialValue) {

value = initialValue;

}

public AtomicInteger() {

}

//获取当前最新值

public final int get() {

return value;

}

//设置当前值,具备volatile效果,方法用final修饰是为了更进一步的保证线程安全。

public final void set(int newValue) {

value = newValue;

}

//最终会设置成newValue,使用该方法后可能导致其他线程在之后的一小段时间内可以获取到旧值,有点类似于延迟加载

public final void lazySet(int newValue) {

unsafe.putOrderedInt(this, valueOffset, newValue);

}

//设置新值并获取旧值,底层调用的是CAS操作即unsafe.compareAndSwapInt()方法

public final int getAndSet(int newValue) {

return unsafe.getAndSetInt(this, valueOffset, newValue);

}

//如果当前值为expect,则设置为update(当前值指的是value变量)

public final boolean compareAndSet(int expect, int update) {

return unsafe.compareAndSwapInt(this, valueOffset, expect, update);

}

//当前值加1返回旧值,底层CAS操作

public final int getAndIncrement() {

return unsafe.getAndAddInt(this, valueOffset, 1);

}

//当前值减1,返回旧值,底层CAS操作

public final int getAndDecrement() {

return unsafe.getAndAddInt(this, valueOffset, -1);

}

//当前值增加delta,返回旧值,底层CAS操作

public final int getAndAdd(int delta) {

return unsafe.getAndAddInt(this, valueOffset, delta);

}

//当前值加1,返回新值,底层CAS操作

public final int incrementAndGet() {

return unsafe.getAndAddInt(this, valueOffset, 1) + 1;

}

//当前值减1,返回新值,底层CAS操作

public final int decrementAndGet() {

return unsafe.getAndAddInt(this, valueOffset, -1) - 1;

}

//当前值增加delta,返回新值,底层CAS操作

public final int addAndGet(int delta) {

return unsafe.getAndAddInt(this, valueOffset, delta) + delta;

}

// ...

}

上面是一部分 AtomicInteger 类的源码,可以看到,在给出的源码中,并没有使用锁来保证并发安全性,而是直接调用了 Unsafe 类中的原子操作

其他 Atomic 类也和 AtomicInteger 类似,最终通过直接调用 Unsafe 类实现了原子性

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值