多线程篇(CAS & AQS(CAS))(持续更新迭代)

目录

一、CAS 操作(并发编程之美)

二、CAS的使用以及底层原理(自我整理)

1. CAS的定义

2. CAS的使用场景

2.1. 原子性操作

2.2. 并发控制

2.3. 无锁数据结构

2.4. 并发容器

3. CAS方法使用示例

4. CAS的ABA问题

5. CAS底层实现原理


一、CAS 操作(并发编程之美)

二、CAS的使用以及底层原理(自我整理)

1. CAS的定义

CAS(Compare and Swap)是一种无锁操作,

通过比较内存中的值与预期值是否相等来实现原子操作,解决并发环境下的数据竞争问题。

2. CAS的使用场景

2.1. 原子性操作

CAS可以用于实现原子性操作,比如对计数器的自增、自减等操作。

由于CAS是一种无锁操作,避免了锁的开销,使得原子性操作更加高效。

2.2. 并发控制

CAS可以用于实现并发控制,比如实现乐观锁机制。

在多线程环境下,通过使用CAS操作来检测共享数据是否被修改,从而避免了使用传统的锁机制,提高了并发

性能。

2.3. 无锁数据结构

CAS可以用于实现无锁数据结构,如无锁队列、无锁链表等。

通过使用CAS操作来保证数据结构的一致性,避免了使用锁的开销,提高了并发性能。

2.4. 并发容器

CAS可以用于实现并发容器,如ConcurrentHashMap等。

通过使用CAS操作来保证容器的线程安全性,避免了使用锁的开销,提高了并发性能。

3. CAS方法使用示例

1、一个简单的CAS操作方法如下:

public static boolean compareAndSwap(int[] array, int index, int expect, int update) {
    // 使用原子操作CAS来比较和交换数组中指定索引位置的值
    return Unsafe.getUnsafe().compareAndSwapInt(array, Unsafe.ARRAY_INT_BASE_OFFSET + index * Unsafe.ARRAY_INT_INDEX_SCALE, expect, update);
}

2、在上述代码中,使用了Unsafe类的compareAndSwapInt方法来进行CAS操作。该方法接受四个参数:数

组对象、数组中的索引、期望值和更新值。它会比较数组中指定索引位置的值是否与期望值相等,如果相等,

则将该位置的值更新为新值,并返回true;否则,不做任何操作,并返回false。

3、需要注意的是,Unsafe类是Java中提供的一个用于进行底层操作的工具类,其中的compareAndSwapInt

方法是一个本地方法,可以直接与硬件平台进行交互,实现原子性的比较和交换操作。在使用时需要注意安全

性和正确性,避免出现不可预料的问题。

4. CAS的ABA问题

CAS的ABA问题指的是在并发环境下,当一个共享变量的值经过一系列操作后,又回到了原始值,并且在这期

间可能有其他线程对该共享变量进行了修改,但是CAS操作却仍然成功,导致无法正确判断共享变量是否被修

改过。

解决ABA问题的常用方案有以下两种:

1. 版本号/标记位

在共享变量中引入一个版本号或标记位,每次修改共享变量时都对其进行更新。当执行CAS操作时,除了比较

值外,还需要比较版本号或标记位,只有当值和版本号/标记位都匹配时才进行更新。这样,在ABA问题发生

时,即使值回到了原始值,但版本号/标记位已经发生了变化,使得CAS操作失败。

2. 借助引用类型

使用带有引用类型的共享变量来解决ABA问题。可以使用AtomicStampedReference或

AtomicMarkableReference类,这两个类都可以在CAS操作时比较引用值及其标记,从而解决ABA

问题。

AtomicStampedReference使用版本号来标记引用值的变化,AtomicMarkableReference使用布尔

标记来标记引用值的变化。

需要注意的是,解决ABA问题的方案需要根据具体场景和需求来选择和使用,同时也需要权衡性能

和复杂性。

5. CAS底层实现原理

  1. 在HotSpot虚拟机中,CAS(Compare And Swap)操作是通过汇编指令实现的,底层涉及到CPU的原子操作。
  2. HotSpot使用了Unsafe类来提供CAS操作的支持。Unsafe类是一个提供了一系列底层操作的工具类,它允许Java程序直接访问底层内存和执行特定的操作,是HotSpot虚拟机的一部分。
  3. Unsafe类中的compareAndSwapInt、compareAndSwapLong和compareAndSwapObject方法是CAS操作的具体实现。这些方法接收三个参数:内存地址、期望值和更新值。它们会根据底层平台的特性,使用汇编指令来进行原子比较和交换操作。
  4. 在x86架构下,HotSpot使用了lock cmpxchg指令来实现CAS操作。该指令会比较内存中的值与期望值,如果相等,则用更新值替换内存中的值,并返回操作前的值。如果不相等,则不会做替换操作。
  5. 在执行CAS操作时,HotSpot会使用内存屏障(Memory Barrier)来保证内存的可见性和有序性。内存屏障有三种类型:LoadLoad屏障、StoreStore屏障和LoadStore屏障。LoadLoad屏障保证在其前面的读操作完成后,后面的读操作才可开始。StoreStore屏障保证在其前面的写操作完成后,后面的写操作才可开始。LoadStore屏障保证在其前面的读操作完成后,后面的写操作才可开始。
  6. CAS操作的实现是CPU级别的原子操作,可以保证在并发环境下的线程安全性。但是,CAS操作也有一些限制,比如无法解决ABA问题,以及在高并发情况下可能导致自旋等待时间过长等问题。因此,在使用CAS时需要根据具体情况进行合理的选择和使用。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

W哥教你学后端

你的鼓励是我创作最大的动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值