Java性能优化-竞争中的原子类
2023-04-18 14:22:47 时间
竞争中的原子类
1.java.util.concurrent.atomic包中的类使用了基于CAS的原语指令而不是传统的同步指令
这些类的性能比编写传统同步方法性能好,除非是极度竞争线程的场景下。
2.极度线程竞争情况下的原子类实现LongAdder
VarHandle的特性和线程本地变量的组合,分段策略
当多线程更新一个LongAdder,该类可以分别为每个线程保存更新。
这些线程不需要等待其他线程的完成操作,因为这些值本质上被存储在一个数组中,每个线程都可以快速返回。
当一个线程试图检索当前值,这些值会被累加起来。
在少竞争场景下
值会随着程序的运行而增加和传统的原子类一样的逻辑实现
在激烈竞争下——空间换时间
更新速度会更快,实例会使用更多的内存存储改值的数组
检索一个值会慢,必须先处理数组中所有待处理更新,竞争激烈下也性能高于传统原子类
LongAdder 整数累加器
public static void main(String[] args) throws InterruptedException {
LongAdder myAdder = new LongAdder();
Runnable incrementer1 = () -> { myAdder.increment(); };
Runnable incrementer2 = () -> { myAdder.increment(); };
Thread thread1 = new Thread(incrementer1);
Thread thread2 = new Thread(incrementer2);
thread1.start();
thread2.start();
thread1.join();
thread2.join();
System.err.println("Total is " + myAdder.sum());
}
VarHandle 内存访问接口
提供统一的内存访问接口,可以使用不同的原子性操作可变的内存地址,而不需要调用特定的硬件指令。
基于JMM实现,在编译时被转换成不同操作系统上的最优原子性代码,同时支持不同的内存屏障(volatile)。
相关文章
- 如何成为合格的Java开发人员
- Nginx主配置参数详解,Nginx配置网站
- Java正则表达式学习笔记
- Java线程池面试必备:核心参数、工作流、监控、调优手段
- 打不过就改变 Java 未来,微软官宣加入 JCP 计划:将参与制定 Java 平台规范
- Java 国际化
- 检测 JVM 自身物理内存用量(RSS)的小技巧
- Java从入门到精通到全栈
- 基于java Springboot实现教务管理系统
- git 提交后Jenkins自动构建、并发布服务
- 编译型语言与解释型语言
- 关于编辑器和解释型编译型语言
- 多道技术、同步异步和阻塞非阻塞
- 升级指南之JDK 11+ 新特性和AJDK
- Spring 国际化@Autowired MessageSource 配置文件读取顺序
- Java中如何解析SQL语句、格式化SQL语句、生成SQL语句?
- 读Java性能权威指南(第2版)笔记09_即时编译器下
- 【Java】先return还是先finally
- 【SpringBoot】AOP默认的动态代理
- 配置完maven环境变量后cmd输入mvn -v命令后报错:NB: JAVA_HOME should point to a JDK not a JRE