java8 如何优化CAS的性能
场景引入
经常都会有下面这段代码,多个线程同时修改一个变量,造成线程不安全,代码如下:
public class ThreadCASDemo implements Runnable {
static int counter=0;
static final Object objLock=new Object(); @Override
public void run() {
counter++;
System.out.println("counter"+counter);
} public static void main(String[] args) {
for (int i = 0; i <20 ; i++) {
ThreadCASDemo threadCASDemo=new ThreadCASDemo();
Thread th=new Thread(threadCASDemo);
th.start();
}
try {
Thread.sleep(2000);
}
catch (Exception ex){ }
System.out.println(counter);
}
}
解决方案
加synchronized锁
public class ThreadCASDemo implements Runnable {
static int counter=0;
static final Object objLock=new Object(); @Override
public void run() {
synchronized (objLock) {
counter++;
}
System.out.println("counter"+counter);
} public static void main(String[] args) {
for (int i = 0; i <20 ; i++) {
ThreadCASDemo threadCASDemo=new ThreadCASDemo();
Thread th=new Thread(threadCASDemo);
th.start();
}
try {
Thread.sleep(2000);
}
catch (Exception ex){ }
System.out.println(counter);
}
}
加synchronized锁的原理示意图如下:
一个个线程排队去更新这个值,这样就感觉太笨重了。synchronized是用来解决更复杂的并发编程场景的。
而且在这个场景下,你一个个排队,加锁处理数据,释放锁,下一个再进来不就相当于串行化了吗。
Atomic原子类
public class ThreadCASAtomic implements Runnable {
static AtomicInteger ati=new AtomicInteger(0);
static final Object objLock=new Object(); @Override
public void run() {
Integer counter=ati.incrementAndGet();
System.out.println("counter"+counter);
} public static void main(String[] args) {
for (int i = 0; i <20 ; i++) {
ThreadCASDemo threadCASDemo=new ThreadCASDemo();
Thread th=new Thread(threadCASDemo);
th.start();
}
}
}
这个之所以效率更高,因为底层是无锁化的CAS。(Compare And Set)。
底层原理如下:每个线程都会先获取当前的值,接着走一个CAS操作,原子的意思就是这个CAS操作一定是自己完整执行完的,不会被别人打断的。
然后CAS操作里,会比较一下说:大兄弟,现在你的值不是我刚刚才获取到的那个值啊?
如果是的化,说明没人改过这个值,那你就给我设置累加1的操作,如果不是的话,发现自己获取的值跟当前的值不一样,会导致CAS失败,失败之后,进入一个无线循环,再次获取值,进行CAS操作。
Java 8 中对CAS机制的优化
上面的做法问题就出现在,如果大量的线程同时并发修改一个AtomicInteger,可能会有很多线程,不停的自旋,进入一个无线的重复循环中。
这些线程不停的获取值,不停的失败。
在高并发的时候,这种情况就会很明显,导致性能和效率都不高。
所以java 8 提出了一个LongAdder,他就是尝试使用分段CAS以及自动分段迁移的方式来大幅度提高多线程高并发执行CAS的操作性能。
java8 如何优化CAS的性能的更多相关文章
- java gc的工作原理、如何优化GC的性能、如何和GC进行有效的交互
java gc的工作原理.如何优化GC的性能.如何和GC进行有效的交互 一个优秀的Java 程序员必须了解GC 的工作原理.如何优化GC的性能.如何和GC进行有效的交互,因为有一些应用程序对性能要求较 ...
- 如何快速优化手游性能问题?从UGUI优化说起
WeTest 导读 本文作者从自身多年的Unity项目UI开发及优化的经验出发,从UGUI,CPU,GPU以及unity特有资源等几个维度,介绍了unity手游性能优化的一些方法. 在之前的文 ...
- SQL常见优化Sql查询性能的方法有哪些?
常见优化Sql查询性能的方法有哪些? 1.查询条件减少使用函数,避免全表扫描 2.减少不必要的表连接 3.有些数据操作的业务逻辑可以放到应用层进行实现 4.可以使用with as 5.使用“临时表”暂 ...
- CSS性能分析,如何优化CSS提高性能
不负十年后的自己,共勉! 前端性能优化一直是一个比较热门的话题,我们总是在尽我们最大的努力去,提高我们的页面性能,比如减少HTTP请求,利用工具对资源进行合并压缩,脚本置底,避免重复请求,css sp ...
- 通过 SMB 直通优化文件服务器的性能
https://technet.microsoft.com/zh-cn/library/hh831487.aspx Windows Server 2012 内置新增功能,称为 SMB 直通,用来支持使 ...
- Tomcat 7优化前及优化后的性能对比
Tomcat 7在我们日常开发.测试.生产环境都会使用到,但对于大部分开发人员来说,对其性能还是没有多大了解.本文就对它做一次性能测试,对比优化前后的性能区别. 一.运行环境 CPU: Intel(R ...
- 【转】利用TCMalloc优化Nginx的性能
From: http://www.linuxidc.com/Linux/2013-04/83197.html TCMalloc的全称是 Thread-Caching Malloc,是谷歌开发的开源工具 ...
- Android App性能优化笔记之一:性能优化是什么及为什么?
By Long Luo 周星驰的电影<功夫>里面借火云邪神之口说出了一句至理名言:“天下武功,唯快不破”. 在移动互联网时代,同样如此,留给一个公司的窗口往往只有很短的时间,如何把握住 ...
- [Unity优化] Unity CPU性能优化
前段时间本人转战unity手游,由于作者(Chwen)之前参与端游开发,有些端游的经验可以直接移植到手游,比如项目框架架构.代码设计.部分性能分析,而对于移动终端而言,CPU.内存.显卡甚至电池等硬件 ...
随机推荐
- java多态转型II
1 package face_09; 2 3 /* 4 * 毕老师和毕姥爷的故事. 5 */ 6 class 毕姥爷 { 7 void 讲课() { 8 System.out.println(&quo ...
- 测试开发实战[提测平台]19-Echarts图表在项目的应用
微信搜索[大奇测试开],关注这个坚持分享测试开发干货的家伙. 在图表统计展示方面,笔者目前使用过的两种开源,分别是 Echats 和 G2Plot 组件,从个人使用上来讲前者应用更广.自定义开发更灵活 ...
- MySQL基本数据类型之枚举与集合类型
目录 一:枚举 1.枚举 2.创建表(使用枚举) 3.表内添加数据 二:集合 1.集合 2.创建表(使用集合) 3.表内添加数据 一:枚举 1.枚举 枚举作用: 提前定义好数据之后 后续录入只能录定义 ...
- 获取nginx日志状态码百分比脚本
#!/bin/bash pwd=/app/nginx/logs/access.log for num1 in `cat $pwd | awk '{print $9}' | grep -Ei " ...
- Component、PureComponent源码解析
1.什么是Component,PureComponent? 都是class方式定义的基类,两者没有什么大的区别,只是PureComponent内部使用shouldComponentUpdate(nex ...
- WSL2设置局域网网访问
标签: wsl2 局域网 docker WSL2设置内网访问 1.先找到虚拟机的ip 2.设置端口转发(需要管理员权限运行powershell) 3.删除端口转发 4.配置入站规则. 1.先找到 ...
- UNIX系统上的抓包工具tcpdump常用命令说明
tcpdump 介绍 tcpdump采用命令行方式对接口的数据包进行筛选抓取,其丰富特性表现在灵活的表达式上. 不带任何选项的tcpdump,默认会抓取第一个网络接口,且只有将tcpdump进程终止才 ...
- Mybatis foreach的用法
本文援引:https://www.cnblogs.com/fnlingnzb-learner/p/10566452.html 在做mybatis的mapper.xml文件的时候,我们时常用到这样的情况 ...
- Java线程--Phaser使用
原创:转载需注明原创地址 https://www.cnblogs.com/fanerwei222/p/11867895.html Java线程--Phaser使用, 代码里头有详细注释: packag ...
- YOLOv5模型训练及检测
一.为什么使用YOLOv5 二.软件工具 2.1 Anaconda https://www.anaconda.com/products/individual 2.2 PyCharm https://w ...