java中的原子性和实现

原子性:不可中断的一系列指令

处理器如何实现原子性

处理器基于对总线加锁和缓存加锁的方式来实现多处理器之间的原子操作。

总线加锁:只有一个处理器能处理这个内存,其他处理器的所有请求都被阻塞,该处理器独占共享内存。
缓存锁定:通过缓存一致性协议,保证同一时刻只有一个处理器能操作某一块内存

java中原子性的实现

在java中是通过锁和循环CAS来实现原子操作的

使用CAS实现原子性

JVM的CAS是利用了CMPXCHG指令实现的。

自旋CAS就是CAS操作直到成功。

原子类:AtomicBoolean,AtomicLong,AtomicInteger,AtomicBoolean。

这些类提供了CAS和原子加1的方法。

CAS相比锁的优势:不用上下文切换

CAS三大问题

(1)ABA问题,JDK的Atomic包的类的compareAndSet方法会检查版本号,从而避免ABA。

(2)循环时间长,需要加最大重试次数,然后抛出异常处理。

(3)只能保证一个变量的原子操作。java推出了AtomicReference 类:

复制代码
do {
    oldPair = pairRef.get();
    newPair = new Pair(newFirst, newSecond);
} while (!pairRef.compareAndSet(oldPair, newPair));

使用锁来实现原子操做

无论是偏向锁,轻量级锁,互斥锁,都用了循环CAS,当一个线程想进入同步块中时使用CAS来获取锁,当它退出时使用循环CAS释放锁。

相关推荐
名字还没想好☜1 小时前
Python f-string 进阶:数字格式化、对齐填充、调试 = 号与嵌套表达式
开发语言·数据库·python·字符串格式化·f-string
·薯条大王2 小时前
经济实惠玩云服务器|一台云服务器多人共用,子账号配置教程
java·linux·运维·服务器·汇编·c++·python
一壶浊酒..4 小时前
Scrape Webpack练习
开发语言·javascript·webpack
ZJH__GO5 小时前
网络编程v4pro--实现聊天室文件传输功能
java·服务器·网络·计算机网络
程序员黑豆5 小时前
Windows 系统 Java 环境变量配置全攻略:解决“不是内部或外部命令”
java·前端·ai编程
命运之光5 小时前
【C语言完整代码】就诊信息管理系统
java·c语言·开发语言
凤山老林5 小时前
Spring Boot @Async 线上实战:从默认配置到生产级线程池治理
java·spring boot·后端
命运之光5 小时前
【C语言完整代码】图书管理系统:图书馆场景下的增删改查实战
c语言·开发语言
猿长大人6 小时前
C# | Serilog 新手入门
开发语言·c#·.net·log
marvelyu6 小时前
每天10分钟学会OceanBase系列(Day 20):跨机房容灾实战——构建多数据中心高可用架构
java·大数据·数据库