并发编程 — AtomicBoolean 详解

目录

1、AtomicBoolean 的基本用法

1.1、AtomicBoolean 的创建

1.2、AtomicBoolean 值得更新

2、AtomicBoolean 内幕

3、为什么需要AtomicBoolean

4、如何支持 boolean 类型


AtomicBoolean提供了一种原子性地读写布尔类型变量的解决方案,通常情况下,该类将被用于原子性地更新状态标识位,比如flag。

1、AtomicBoolean 的基本用法

AtomicBoolean类比较简单,其内部实现原理与AtomicInteger类似

1.1、AtomicBoolean 的创建

AtomicBoolean 也提供了个有参,无参 两个构造方法。

 //无参 构造方法默认值为 false
 AtomicBoolean flag = new AtomicBoolean();

//有参构造方法,可以指定初始值
 AtomicBoolean flag1 = new AtomicBoolean(true);

1.2、AtomicBoolean 值得更新

  • compareAndSet(boolean expect, boolean update):对比并且设置boolean最新的值,类似于AtomicInteger的compareAndSet方法,期望值与Atomic Boolean的当前值一致时执行新值的设置动作,若设置成功则返回true,否则直接返回false。
  • weakCompareAndSet(boolean expect, boolean update):同上。
  • set(boolean newValue):设置AtomicBoolean最新的value值,该新值的更新对其他线程立即可见。
  • getAndSet(boolean newValue):返回AtomicBoolean的前一个布尔值,并且设置新的值。
public class AtomicBooleanExample {
    public static void main(String[] args) {
        AtomicBoolean flag = new AtomicBoolean();
        boolean andSet = flag.getAndSet(true);

        System.out.println("原始值:" + andSet);
        System.out.println("当前值:" + flag.get());
    }
}

2、AtomicBoolean 内幕

AtomicBoolean的实现方式比较类似于AtomicInteger类,实际上AtomicBoolean内部的value本身就是一个volatile关键字修饰的int类型的成员属性。

 // setup to use Unsafe.compareAndSwapInt for updates
    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); }
    }

    // 通过 volatile 关键字修饰的 value 值
    private volatile int value;

3、为什么需要AtomicBoolean

 对于int或者long型变量,需要进行加减操作,所以要加锁;但对于一个boolean类型来说,true或false的赋值和取值操作,加上volatile关键字就够了,为什么还需要AtomicBoolean呢?

我们可能存在如下情况:

boolean flag = false;
if(flag == false){
            
 flag = true;
  ......
}

也就是要实现compare和set两个操作合在一起的原子性,而这也正是CAS提供的功能。上面的代码,就变成:

if(flag.compareAndSet(false, true)){

  // TODO 

 }

4、如何支持 boolean 类型

在Unsafe类中,只提供了三种类型的CAS操作:int、long、Object(也就是引用类型)。如下所示。

public final native boolean compareAndSwapObject(Object var1, long var2, Object var4, Object var5);

public final native boolean compareAndSwapInt(Object var1, long var2, int var4, int var5);

public final native boolean compareAndSwapLong(Object var1, long var2, long var4, long var6);

AtomicBoolean 类型怎么支持呢?

对于用 int 型来代替的,在入参的时候,将 boolean 类型转换成 int 类型;在返回值的时候,将 int 类型转换成 boolean 类型。如下所示。


 // 获取 boolean 值 其实是 比较当前 value 值是否为 0
    public final boolean get() {
        return value != 0;
    }


// 设置 boolean 的值,其实最终转换为了 1 或 0
    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);
    }

 

  • 9
    点赞
  • 55
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
AtomicBoolean是Java中的一个类,用于实现原子操作的布尔值。它通常用于多线程环境下的并发控制和状态标记。 使用AtomicBoolean可以保证对布尔值的操作是原子性的,避免了并发环境下的竞态条件和数据不一致的问题。它提供了一些方法,比如compareAndSet、weakCompareAndSet、set和getAndSet等,用于对AtomicBoolean对象进行更新和获取操作。 compareAndSet方法用于对比并设置AtomicBoolean最新的值。它会将期望值与AtomicBoolean的当前值进行比较,如果一致,则进行新值的设置。如果设置成功,则返回true,否则返回false。 set方法用于设置AtomicBoolean的最新值,该新值对其他线程立即可见。 getAndSet方法用于返回AtomicBoolean的前一个布尔值,并设置新的值。 在使用AtomicBoolean时,可以通过创建AtomicBoolean对象,并调用其相应的方法来进行操作。例如,可以通过getAndSet方法获取AtomicBoolean的前一个值,并设置新的值。 总之,AtomicBoolean可以确保对布尔值的操作是线程安全的,并提供了一些方法来进行原子操作。 #### 引用[.reference_title] - *1* [AtomicBoolean](https://blog.csdn.net/qq_37896194/article/details/118763679)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] - *2* *3* [并发编程AtomicBoolean 详解](https://blog.csdn.net/small_love/article/details/111057268)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值