java多线程编程------CAS

本文介绍了CAS(CompareandSwap)在Java多线程中的应用,包括其工作原理,如何通过无锁编程解决线程安全问题,以及CAS可能遇到的ABA问题。作者通过示例展示了如何使用原子类如AtomicInteger来实现线程安全操作,以及如何通过版本号机制避免ABA问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、CAS的介绍

在JDK1.之前,java的多线程都是靠synchronized来保证同步的,这会引发很多性能问题,例如死锁。但随着Java的不断完善,JNI使得java能越过JVM直接调用本地方法,例如CAS。CAS ,它用于实现多线程同步的原子指令,允许算法执行读-修改-写的操作,而无须担心其他线程同时修改变量。

二.CAS的工作原理

CAS全称Cpmpare and swap,能够通过比较内存和寄存器的值是否相等,看是否要交换内存和另一个寄存器的值。
在这里插入图片描述
上述比较,交换都是通过一条CPU指令来完成的,所以也就可以认为它是原子的。线程安全那一篇我们谈过,造成线程安全问题的第二点就是进行的操作不是原子的,我们通过加锁和给变量加volatile去解决这个问题的。而CAS本身已经是原子的,基于这点,那么他又给我们打开了另一扇大门,无锁编程。

三.CAS的运用

实现原子类

前面我们聊过多个线程同时访问同一个变量并且进行修改会触发线程安全问题,如果多个线程同时对某一个变量进行++操作那么必然造成线程安全问题。因为对某一个变量进行++,其中涉及,load,add,save,由于线程的抢占式的执行和不是原子性的操作导致结果出现偏差(在前几篇细讲过)。因此java标准库中提供了一组原子类。
在这里插入图片描述

import java.util.concurrent.atomic.AtomicBoolean;
import java.util.concurrent.atomic
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值