在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

最新文章

  1. SVN 服务启动报错 0x8007042a
  2. windows sdk编程 richedit创建,像十六进制编辑器一样显示文件
  3. jQuery实现全选、全不选、反选
  4. ISO 14229 简介 转载
  5. 17. Word Break &amp;&amp; Word Break II
  6. 为什么Erlang比C慢那么多倍?
  7. 软工实践练习一——使用Git进行代码管理心得
  8. 本地化Model Factory
  9. Android EditText 获得输入焦点 以及requestfocus()失效的问题
  10. ADO.NET 快速入门(三):从存储过程获取输出参数
  11. 《Linux命令行大全》系列(三、Linux 系统)
  12. 实用Shell命令备忘
  13. MQTT 简介
  14. net core appsetting配置
  15. 基于Cmake+QT+VS的C++项目构建开发编译简明教程
  16. python爬取中国天气网站数据并对其进行数据可视化
  17. js循环中使用async/await踩过的坑
  18. [20180928]ora-01426(补充).txt
  19. 11款插件让你的Chrome成为全世界最好用的浏览器|Chrome插件推荐
  20. Linux 从源码编译安装 OpenSSH

热门文章

  1. WebElement的方法:
  2. 20191011-构建我们公司自己的自动化接口测试框架-Util的AssertResult模块
  3. c语言 c++程序运行过程
  4. PAT-1013 Battle Over Cities (25 分) DFS求连通块
  5. Java Web 深入分析(6) Tomcat
  6. Bat 批处理启动和停止Oracle 服务
  7. IOC实现-Unity
  8. Map集合中key不存在时使用toString()方法、valueOf()方法和强制转换((String))之间的区别
  9. 全面聊聊JavaScript的浅拷贝和深拷贝
  10. Oracle 数据 查询 一对多 取最新一条非 0 数据