返回
CAS: 并发编程中的乐观锁
后端
2024-01-01 04:13:23
CAS 简介
CAS (compare and swap) 是一种并发编程算法设计时使用的一种技术,可用于实现乐观锁。CAS 操作包含三个操作数:内存地址、期望值和新值。它尝试使用期望值和新值来更新内存地址。如果内存地址的值等于期望值,则执行更新操作,否则执行失败。CAS 操作通常用于实现无锁数据结构和并发控制。
CAS 工作原理
CAS 操作由三个步骤组成:
- 读取内存地址的值。
- 如果内存地址的值等于期望值,则将新值写入内存地址。
- 如果内存地址的值不等于期望值,则说明内存地址的值已经被其他线程修改,CAS 操作失败。
CAS 操作可以保证原子性,即要么成功执行更新操作,要么失败。如果 CAS 操作失败,则说明内存地址的值已经被其他线程修改,需要重新读取内存地址的值并再次执行 CAS 操作。
CAS 使用场景
CAS 操作通常用于实现无锁数据结构和并发控制。例如:
- 计数器:可以使用 CAS 操作来实现无锁计数器。
- 链表:可以使用 CAS 操作来实现无锁链表。
- 队列:可以使用 CAS 操作来实现无锁队列。
- 哈希表:可以使用 CAS 操作来实现无锁哈希表。
CAS 在 Java 中的实现
Java 中可以使用 java.util.concurrent.atomic
包中的 AtomicInteger
和 AtomicReference
类来实现 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
包中的 AtomicInteger
和 AtomicReference
类来实现 CAS 操作。