AtomicBoolean的妙用

在开发中,经常要设置代码开关,通常的做法如下:

 //这是一个全局变量
 boolean isStart = false;

然后在某一个需要设置开关的位置:

if(!isStart ){
    isStart = true;
    doSomething();
}

显然这是线程不安全的,通过使用AtomicBoolean可以这样做:

private static AtomicBoolean isStart = new AtomicBoolean(false);

在开关位置:

    if(isStart.compareAndSet(false, true) )
    {
        doSomething();
    }

compareAndSet是基于CAS的原子操作,是线程安全的,参照jdk源码的描述:

/**
 * Atomically sets the value to the given updated value
 * if the current value {@code ==} the expected value.
 *
 * @param expect the expected value
 * @param update the new value
 * @return true if successful. False return indicates that
 * the actual value was not equal to the expected value.
 */
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);
}

如果isStart 和expect值相同,则设置isStart 为update值,并返回true,否则返回false。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值