AtomicBoolean的使用


Atomic是原子的意思。很显然,是为了解决多线程的原子性问题。AtomicBoolean 就是其中的一个。

介绍下几个常用的方法。

get

public final boolean get() {
    return value != 0;
}

当value为1时 value != 0 true
当value为0时 value != 0 false

set

public final void set(boolean newValue) {
    value = newValue ? 1 : 0;
}

很明显,这个是强制置值。
boolean为true value设置为1
boolean为false value设置为0

compareAndSet

public final boolean compareAndSet(boolean expect, boolean update) {
    int e = expect ? 1 : 0;
    int u = update ? 1 : 0;
    return unsafe.compareAndSwapInt(this, valueOffset, e, u);
}

如果当前值==期待值,将值设置为指定的更新值。
返回值:
如果成功,假表示实际值!=预期值。

getAndSet

public final boolean getAndSet(boolean newValue) {
boolean prev;
do {
prev = get(); // 暂存上一个值
} while (!compareAndSet(prev, newValue)); // 这个while没太看懂,应该是为了确定可以拿到值。
return prev;
}

自动设置为给定值并返回上一个值。

Unsafe

Unsafe是java基础工具rt.jar中的类,AtomicBoolean就用到了Unsafe。

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

static {
    try {
        valueOffset = unsafe.objectFieldOffset
            (AtomicBoolean.class.getDeclaredField("value"));
    } catch (Exception ex) { throw new Error(ex); }
}

Unsafe.compareAndSwapInt
此方法是Java的native方法,并不由Java语言实现。
方法的作用是,读取传入对象o在内存中偏移量为offset位置的值与期望值expected作比较。
相等就把x值赋值给offset位置的值。方法返回true。
不相等,就取消赋值,方法返回false。
这也是CAS的思想,及比较并交换。用于保证并发时的无锁并发的安全性。

初始值是设置为true好,还是false好

new AtomicBoolean(false);

true和false都是可以的,但是注意判断的时候逻辑要相反。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值