返回

CAS: 并发编程中的乐观锁

后端

CAS 简介

CAS (compare and swap) 是一种并发编程算法设计时使用的一种技术,可用于实现乐观锁。CAS 操作包含三个操作数:内存地址、期望值和新值。它尝试使用期望值和新值来更新内存地址。如果内存地址的值等于期望值,则执行更新操作,否则执行失败。CAS 操作通常用于实现无锁数据结构和并发控制。

CAS 工作原理

CAS 操作由三个步骤组成:

  1. 读取内存地址的值。
  2. 如果内存地址的值等于期望值,则将新值写入内存地址。
  3. 如果内存地址的值不等于期望值,则说明内存地址的值已经被其他线程修改,CAS 操作失败。

CAS 操作可以保证原子性,即要么成功执行更新操作,要么失败。如果 CAS 操作失败,则说明内存地址的值已经被其他线程修改,需要重新读取内存地址的值并再次执行 CAS 操作。

CAS 使用场景

CAS 操作通常用于实现无锁数据结构和并发控制。例如:

  • 计数器:可以使用 CAS 操作来实现无锁计数器。
  • 链表:可以使用 CAS 操作来实现无锁链表。
  • 队列:可以使用 CAS 操作来实现无锁队列。
  • 哈希表:可以使用 CAS 操作来实现无锁哈希表。

CAS 在 Java 中的实现

Java 中可以使用 java.util.concurrent.atomic 包中的 AtomicIntegerAtomicReference 类来实现 CAS 操作。例如:

import java.util.concurrent.atomic.AtomicInteger;

public class CASDemo {

    private static AtomicInteger counter = new AtomicInteger(0);

    public static void main(String[] args) {
        for (int i = 0; i < 10; i++) {
            new Thread(() -> {
                while (true) {
                    int expectedValue = counter.get();
                    int newValue = expectedValue + 1;
                    if (counter.compareAndSet(expectedValue, newValue)) {
                        System.out.println("更新成功,当前计数器值:" + counter.get());
                        break;
                    }
                }
            }).start();
        }
    }
}

在上面的代码中,我们使用 AtomicInteger 类来实现 CAS 操作。compareAndSet 方法尝试使用期望值和新值来更新计数器的值。如果计数器值等于期望值,则执行更新操作,否则执行失败。

总结

CAS 操作是一种用于实现乐观锁的并发编程技术。它可以保证原子性,即要么成功执行更新操作,要么失败。CAS 操作通常用于实现无锁数据结构和并发控制。在 Java 中,可以使用 java.util.concurrent.atomic 包中的 AtomicIntegerAtomicReference 类来实现 CAS 操作。