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

相关推荐
工具派2 分钟前
Word文档太大怎么拆分?段落结构与两种拆法的边界实测
开发语言·c#·word
曹牧7 分钟前
Spring MVC : Controller 层URL划分
java·运维·服务器·前端
wjcroom18 分钟前
实现老型号HP打印机手机无线打印的一些步骤和方法
开发语言·智能手机·php
潜龙952720 分钟前
需求文档一键变测试用例:手工用例智能生成平台
开发语言·c#
卓怡学长22 分钟前
w203基于springboot钢材仓库管理系统的设计与实现
java·spring boot·spring·intellij-idea
sunburn-24 分钟前
Java 排序算法详细教学:从冒泡排序到快速排序
java·开发语言·数据结构·ide·算法
鹤卿12327 分钟前
「iOS」GCD
开发语言·ios·objective-c
我是小白呀28 分钟前
编排还是事件协作?用 AcmeFlow 讲清企业 Workflow 的控制权
java·开发语言
ACP广源盛1392462567332 分钟前
接口适配方案选型|GSV6125@ACP HDMI2.0 转 Type‑C/DP1.4 桥接芯片工程评估
大数据·c语言·开发语言·硬件架构·硬件工程·国产芯片
深入云栈42 分钟前
Netty 4.2.x 源码深度解析 (十四):KQueue 传输 —— macOS 高性能 IO 的 Netty 实现
java·后端