synchronized和AtomicXXX效率比较
在Java中,i++和++i都是xian线程不安全的,如果要用十个线程累加一个资源,就会出现错误。synchronized和Atomic是实现线程安全常用方法。而二者效率问题孰优孰劣?
本着规律符合任意情况原则,简单写了一个测试代码:
public class AtomicTest {
int count = 0;
AtomicInteger count1 = new AtomicInteger(0);//2283 1895 2328 2015 2264
//57 56 55
synchronized void m() {
for (int i = 0; i < 150000; i++) {
count++;
}
}
void n() {
for (int i = 0; i < 150000; i++) {
count1.incrementAndGet();
}
}
public static void main(String a[]) {
long start = System.currentTimeMillis();
AtomicTest t = new AtomicTest();
List<Thread> threads = new ArrayList<>();
for (int i = 0; i < 10; i++) {
threads.add(new Thread(t::m, "thread " + i));
}
threads.forEach((o) -> o.start());
threads.forEach((o) -> {
try {
o.join();
} catch (InterruptedException e) {
e.printStackTrace();
}
});
System.out.println("increase-->" + t.count);
System.out.println(System.currentTimeMillis() - start);
System.out.println("----------------------------------");
long start1 = System.currentTimeMillis();
AtomicTest t1 = new AtomicTest();
List<Thread> thread = new ArrayList<>();
for (int i = 0; i < 10; i++) {
thread.add(new Thread(t1::n, "thread " + i));
}
thread.forEach((o) -> o.start());
thread.forEach((o) -> {
try {
o.join();
} catch (InterruptedException e) {
e.printStackTrace();
}
});
System.out.println("atomic-->" + t1.count1);
System.out.println(System.currentTimeMillis() - start1);
}
}
测试过后发现,并非Atomic方法一定由于synchronized
当低并发时(小于150000),Atomic效率优于synchronized
当高并发时(大于150000),synchronized效率优于Atomic
*150000为本机测试数据,不准
总结:
synchronized :重量级操作,基于悲观锁,可重入锁。
AtomicInteger:乐观 ,用CAS实现
当并发量大时,Atomic 出错概率会增大,不断校正错误更费时间
原文链接:https://blog.csdn.net/baidu_35773818/article/details/89604328
最新文章
- SVN 服务启动报错 0x8007042a
- windows sdk编程 richedit创建,像十六进制编辑器一样显示文件
- jQuery实现全选、全不选、反选
- ISO 14229 简介 转载
- 17. Word Break &;&; Word Break II
- 为什么Erlang比C慢那么多倍?
- 软工实践练习一——使用Git进行代码管理心得
- 本地化Model Factory
- Android EditText 获得输入焦点 以及requestfocus()失效的问题
- ADO.NET 快速入门(三):从存储过程获取输出参数
- 《Linux命令行大全》系列(三、Linux 系统)
- 实用Shell命令备忘
- MQTT 简介
- net core appsetting配置
- 基于Cmake+QT+VS的C++项目构建开发编译简明教程
- python爬取中国天气网站数据并对其进行数据可视化
- js循环中使用async/await踩过的坑
- [20180928]ora-01426(补充).txt
- 11款插件让你的Chrome成为全世界最好用的浏览器|Chrome插件推荐
- Linux 从源码编译安装 OpenSSH
热门文章
- WebElement的方法:
- 20191011-构建我们公司自己的自动化接口测试框架-Util的AssertResult模块
- c语言 c++程序运行过程
- PAT-1013 Battle Over Cities (25 分) DFS求连通块
- Java Web 深入分析(6) Tomcat
- Bat 批处理启动和停止Oracle 服务
- IOC实现-Unity
- Map集合中key不存在时使用toString()方法、valueOf()方法和强制转换((String))之间的区别
- 全面聊聊JavaScript的浅拷贝和深拷贝
- Oracle 数据 查询 一对多 取最新一条非 0 数据