线程安全之AtomicBoolean

本文介绍了Java中的AtomicBoolean类,它提供了一种线程安全的方式来进行布尔值的更新。通过其compareAndSet方法,利用CAS(Compare and Swap)技术确保并发场景下的安全性。AtomicBoolean常用于确保某段代码只由一个线程执行,起到了类似锁的效果。文中还简单提及了CAS的工作原理及其在并发编程中的应用。

说明

AtomicBoolean 这个类,他是线程安全的,它的compareAndSet方法是利用CAS来实现线程安全的。

方法

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);
}

作用

判断对象当时内部值是否为第一个参数,如果是则更新为第二个参数,且返回ture,否则返回false。

用途

保证某段语句只执行一次,只有一个线程执行,类似于锁的操作

示例

当默认初始化为false时,如下:

protected final AtomicBoolean started = new AtomicBoolean(false);

则一个线程把他变为ture,compareAndSet返回ture,进入方法体执行逻辑,那么其他的任何线程进入该方法执行compareAndSet时第一个参数为false,而对象的内部值已经被修改为true,则永远过不了if,例如:

    public void start() throws Exception {
        
        try {
            if (started.compareAndSet(false, true)) {
                try {
                    // 应对一些场景
                    
                }
            }
        } catch (Exception e) {
            e.printStackTrace();
        }

    }

当以上方法执行结束的时候我把对象的值变成false,compareAndSet可以继续可以将对象则的值设置成true,返回true。

    public void stop() {
        try {
            if (started.compareAndSet(true, false)) {
                //场景说明
                
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

CAS

这里额外说一下,CAS(Compare and Swap),即比较并替换,实现并发算法时常用到的一种技术,Doug lea大神在java同步器中大量使用了CAS技术,鬼斧神工的实现了多线程执行的安全性。

CAS的思想很简单:三个参数,一个当前内存值V、旧的预期值A、即将更新的值B,当且仅当预期值A和内存值V相同时,将内存值修改为B并返回true,否则什么都不做,并返回false。至于CAS这里不多说,了解可参考https://www.jianshu.com/p/fb6e91b013cc

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值