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释放锁。

相关推荐
良木生香10 分钟前
【C++初阶】:STL——String从入门到应用完全指南(3)
c语言·开发语言·数据结构·c++·算法
云烟成雨TD13 分钟前
Spring AI Alibaba 1.x 系列【33】Human-in-the-Loop(人在回路)演示
java·人工智能·spring
難釋懷18 分钟前
Redis服务器端优化-内存划分和内存配置
java·redis·spring
两年半的个人练习生^_^18 分钟前
每日一学:设计模式之适配器模式
java·设计模式·适配器模式
程序员老邢25 分钟前
【技术底稿 18】FTP 文件处理 + LibreOffice Word 转 PDF 在线预览 + 集群乱码终极排查全记录
java·经验分享·后端·pdf·word·springboot
fox_lht28 分钟前
8.3.使用if let和let else实现简明的程序流控制
开发语言·后端·算法·rust
AI玫瑰助手34 分钟前
Python基础:列表的定义、增删改查核心操作
android·开发语言·python
mOok ONSC35 分钟前
对基因列表中批量的基因进行GO和KEGG注释
开发语言·数据库·golang
磊 子43 分钟前
类模板与派生1
java·开发语言·c++
:1211 小时前
java面试基础2
java·开发语言·面试